rsruby 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +5 -0
- data/License.txt +504 -0
- data/Manifest.txt +37 -0
- data/README.txt +96 -0
- data/examples/arrayfields.rb +50 -34
- data/examples/bioc.rb +34 -98
- data/examples/dataframe.rb +34 -14
- data/examples/erobj.rb +29 -15
- data/ext/{rsruby/Converters.c → Converters.c} +50 -25
- data/ext/{rsruby/Converters.h → Converters.h} +3 -0
- data/ext/{rsruby/R_eval.c → R_eval.c} +0 -0
- data/ext/{rsruby/R_eval.h → R_eval.h} +0 -0
- data/ext/{rsruby/extconf.rb → extconf.rb} +0 -7
- data/ext/{rsruby/robj.c → robj.c} +0 -0
- data/ext/{rsruby/rsruby.c → rsruby.c} +12 -26
- data/ext/{rsruby/rsruby.h → rsruby.h} +0 -0
- data/lib/rsruby.rb +49 -125
- data/lib/rsruby/dataframe.rb +11 -6
- data/lib/rsruby/erobj.rb +18 -10
- data/lib/rsruby/robj.rb +7 -2
- data/test/table.txt +4 -0
- data/test/tc_array.rb +13 -16
- data/test/tc_boolean.rb +5 -8
- data/test/tc_cleanup.rb +11 -13
- data/test/tc_eval.rb +9 -5
- data/test/tc_extensions.rb +26 -0
- data/test/tc_io.rb +7 -10
- data/test/tc_library.rb +6 -6
- data/test/tc_modes.rb +131 -79
- data/test/tc_robj.rb +26 -29
- data/test/tc_sigint.rb +1 -1
- data/test/tc_to_r.rb +57 -60
- data/test/tc_to_ruby.rb +62 -65
- data/test/tc_vars.rb +14 -14
- data/test/test_all.rb +21 -0
- metadata +34 -40
- data/README +0 -102
data/lib/rsruby/dataframe.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
+
require 'rsruby'
|
2
|
+
require 'rsruby/erobj'
|
3
|
+
|
1
4
|
#== Synopsis
|
2
5
|
#
|
3
|
-
#This is an extended
|
6
|
+
#This is an extended ERObj class inspired by the example given in the RPy
|
4
7
|
#manual used for R data frames.
|
5
|
-
#As with
|
8
|
+
#As with ERObj, methods caught by method_missing are converted into attribute
|
6
9
|
#calls on the R dataframe it represents. The rows and columns methods give
|
7
10
|
#access to the column and row names.
|
8
11
|
#
|
9
12
|
#== Usage
|
10
13
|
#
|
11
|
-
#See examples/dataframe.rb for
|
14
|
+
#See examples/dataframe.rb[link:files/examples/dataframe_rb.html] for
|
15
|
+
#examples of usage.
|
12
16
|
#
|
13
17
|
#--
|
14
18
|
#== Author
|
@@ -41,9 +45,6 @@
|
|
41
45
|
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
42
46
|
#++
|
43
47
|
|
44
|
-
require 'rsruby'
|
45
|
-
require 'rsruby/erobj'
|
46
|
-
|
47
48
|
class DataFrame < ERObj
|
48
49
|
|
49
50
|
#Returns an array of the row names used in the R data frame.
|
@@ -58,6 +59,10 @@ class DataFrame < ERObj
|
|
58
59
|
return cols
|
59
60
|
end
|
60
61
|
|
62
|
+
def[](col)
|
63
|
+
return @r['$'].call(@robj,col.to_s)
|
64
|
+
end
|
65
|
+
|
61
66
|
def method_missing(attr)
|
62
67
|
attr = attr.to_s
|
63
68
|
mode = RSRuby.get_default_mode
|
data/lib/rsruby/erobj.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
|
+
require 'rsruby'
|
2
|
+
|
1
3
|
#== Synopsis
|
2
4
|
#
|
3
|
-
#This is an extended
|
5
|
+
#This is an extended RObj class inspired by the example given in the RPy
|
4
6
|
#manual. Methods caught by method_missing are converted into attribute calls
|
5
7
|
#on the R object it represents. Also to_s is redefined to print exactly the
|
6
|
-
#representation used in R
|
8
|
+
#representation used in R.
|
7
9
|
#
|
8
10
|
#== Usage
|
9
11
|
#
|
10
|
-
#See examples/erobj.rb for examples of
|
12
|
+
#See examples/erobj.rb[link:files/examples/erobj_rb.html] for examples of
|
13
|
+
#usage.
|
11
14
|
#
|
12
15
|
#--
|
13
16
|
# == Author
|
@@ -40,25 +43,28 @@
|
|
40
43
|
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
41
44
|
#++
|
42
45
|
|
43
|
-
require 'rsruby'
|
44
|
-
|
45
46
|
class ERObj
|
46
47
|
|
47
48
|
@@x = 1
|
48
49
|
|
49
|
-
#
|
50
|
+
#The ERObj is intialised by passing it an RObj instance which it then stores
|
50
51
|
def initialize(robj)
|
51
52
|
@robj = robj
|
52
53
|
@r = RSRuby.instance
|
53
54
|
end
|
54
55
|
|
55
|
-
#Returns the
|
56
|
-
#R.
|
56
|
+
#Returns the storred RObj.
|
57
57
|
def as_r
|
58
58
|
@robj.as_r
|
59
59
|
end
|
60
60
|
|
61
|
-
#
|
61
|
+
#Returns the Ruby representation of the object according to the basic
|
62
|
+
#conversion mode.
|
63
|
+
def to_ruby
|
64
|
+
@robj.to_ruby(RSRuby::BASIC_CONVERSION)
|
65
|
+
end
|
66
|
+
|
67
|
+
#Calls the storred RObj.
|
62
68
|
def lcall(args)
|
63
69
|
@robj.lcall(args)
|
64
70
|
end
|
@@ -72,7 +78,7 @@ class ERObj
|
|
72
78
|
RSRuby.set_default_mode(RSRuby::NO_CONVERSION)
|
73
79
|
a = @r.textConnection("tmpobj#{@@x}",'w')
|
74
80
|
|
75
|
-
RSRuby.set_default_mode(RSRuby::
|
81
|
+
RSRuby.set_default_mode(RSRuby::VECTOR_CONVERSION)
|
76
82
|
@r.sink(:file => a, :type => 'output')
|
77
83
|
@r.print_(@robj)
|
78
84
|
@r.sink.call()
|
@@ -86,6 +92,8 @@ class ERObj
|
|
86
92
|
|
87
93
|
end
|
88
94
|
|
95
|
+
#Methods caught by method_missing are converted into attribute calls on
|
96
|
+
#the R object it represents.
|
89
97
|
def method_missing(attr)
|
90
98
|
mode = RSRuby.get_default_mode
|
91
99
|
RSRuby.set_default_mode(RSRuby::BASIC_CONVERSION)
|
data/lib/rsruby/robj.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
#This class represents a reference to an object in the R interpreter. It
|
4
4
|
#also holds a conversion mode used if the RObj represents a callable function.
|
5
5
|
#RObj objects can be passed to R functions called from Ruby and are the
|
6
|
-
#default return type if
|
6
|
+
#default return type if RSRuby cannot convert the returned results of an R
|
7
7
|
#function.
|
8
8
|
#
|
9
9
|
#--
|
@@ -32,7 +32,9 @@ class RObj
|
|
32
32
|
|
33
33
|
attr_accessor :conversion, :wrap
|
34
34
|
|
35
|
-
|
35
|
+
#Attempts to call the RObj with the arguments given. Returns the result
|
36
|
+
#of calling the R object. Only use this method if the RObj represents an
|
37
|
+
#R function.
|
36
38
|
def call(*args)
|
37
39
|
if @wrap
|
38
40
|
e = RSRuby.get_default_mode
|
@@ -45,6 +47,9 @@ class RObj
|
|
45
47
|
return ret
|
46
48
|
end
|
47
49
|
|
50
|
+
#Sets the conversion mode for this RObj (only relevant if the RObj
|
51
|
+
#represents a function). See the constants in RSRuby for valid modes.
|
52
|
+
#Returns the current conversion mode if called with no argument.
|
48
53
|
def autoconvert(m=false)
|
49
54
|
if m
|
50
55
|
raise ArgumentError if m < -1 or m > RSRuby::TOP_CONVERSION
|
data/test/table.txt
ADDED
data/test/tc_array.rb
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rsruby'
|
3
3
|
|
4
|
-
unless $r
|
5
|
-
$r = RSRuby.instance
|
6
|
-
end
|
7
|
-
|
8
4
|
class TestArray < Test::Unit::TestCase
|
9
5
|
|
10
6
|
def setup
|
11
7
|
|
8
|
+
@r = RSRuby.instance
|
12
9
|
@ruby_AoA = [[[0,6,12,18],[2,8,14,20],[4,10,16,22]],
|
13
10
|
[[1,7,13,19],[3,9,15,21],[5,11,17,23]]]
|
14
11
|
|
15
12
|
RSRuby.set_default_mode(RSRuby::NO_DEFAULT)
|
16
|
-
|
17
|
-
@r_array =
|
13
|
+
@r.array.autoconvert(RSRuby::NO_CONVERSION)
|
14
|
+
@r_array = @r.array({ :data => (0..24).to_a,
|
18
15
|
:dim => [2,3,4]})
|
19
|
-
|
16
|
+
@r.array.autoconvert(RSRuby::BASIC_CONVERSION)
|
20
17
|
end
|
21
18
|
|
22
19
|
def test_convert_to_ruby
|
@@ -25,22 +22,22 @@ class TestArray < Test::Unit::TestCase
|
|
25
22
|
|
26
23
|
#I suspect this only works in RPy with Numeric?
|
27
24
|
def test_convert_to_R
|
28
|
-
|
29
|
-
|
30
|
-
o =
|
31
|
-
|
32
|
-
#assert_equal(
|
25
|
+
@r.list.autoconvert(RSRuby::NO_CONVERSION)
|
26
|
+
@r['[['].autoconvert(RSRuby::NO_CONVERSION)
|
27
|
+
o = @r['[['].call(@r.list(@ruby_AoA),1)
|
28
|
+
@r['[['].autoconvert(RSRuby::BASIC_CONVERSION)
|
29
|
+
#assert_equal(@r.all_equal(o,@r_array),true)
|
33
30
|
end
|
34
31
|
|
35
32
|
def test_dimensions
|
36
|
-
assert_equal(
|
33
|
+
assert_equal(@r.dim(@r_array),[@ruby_AoA.length,
|
37
34
|
@ruby_AoA[0].length,
|
38
35
|
@ruby_AoA[0][0].length])
|
39
36
|
end
|
40
37
|
|
41
38
|
def test_elements
|
42
|
-
assert_equal(@ruby_AoA[0][0][0]
|
43
|
-
assert_equal(@ruby_AoA[1][1][1]
|
39
|
+
assert_equal(@ruby_AoA[0][0][0],@r['[['].call(@r_array, 1,1,1))
|
40
|
+
assert_equal(@ruby_AoA[1][1][1],@r['[['].call(@r_array, 2,2,2))
|
44
41
|
end
|
45
42
|
|
46
43
|
def test_ruby_out_of_bounds
|
@@ -51,7 +48,7 @@ class TestArray < Test::Unit::TestCase
|
|
51
48
|
|
52
49
|
def test_R_out_of_bounds
|
53
50
|
assert_raise RException do
|
54
|
-
|
51
|
+
@r['[['].call(@r_array, 5,5,5)
|
55
52
|
end
|
56
53
|
end
|
57
54
|
|
data/test/tc_boolean.rb
CHANGED
@@ -1,27 +1,24 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rsruby'
|
3
3
|
|
4
|
-
unless $r
|
5
|
-
$r = RSRuby.instance
|
6
|
-
end
|
7
|
-
|
8
4
|
class TestBoolean < Test::Unit::TestCase
|
9
5
|
|
10
6
|
def setup
|
7
|
+
@r = RSRuby.instance
|
11
8
|
RSRuby.set_default_mode(RSRuby::NO_DEFAULT)
|
12
9
|
end
|
13
10
|
|
14
11
|
def test_true
|
15
12
|
assert_block "r.TRUE not working" do
|
16
|
-
(
|
17
|
-
|
13
|
+
(@r.typeof(@r.FALSE) == 'logical' and
|
14
|
+
@r.as_logical(@r.TRUE))
|
18
15
|
end
|
19
16
|
end
|
20
17
|
|
21
18
|
def test_false
|
22
19
|
assert_block "r.FALSE not working" do
|
23
|
-
(
|
24
|
-
|
20
|
+
(@r.typeof(@r.FALSE) == 'logical' and not
|
21
|
+
@r.as_logical(@r.FALSE))
|
25
22
|
end
|
26
23
|
end
|
27
24
|
end
|
data/test/tc_cleanup.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rsruby'
|
3
3
|
|
4
|
-
unless $r
|
5
|
-
$r = RSRuby.instance
|
6
|
-
end
|
7
|
-
|
8
4
|
class TestCleanup < Test::Unit::TestCase
|
9
5
|
|
10
|
-
def
|
11
|
-
|
12
|
-
$r.shutdown
|
13
|
-
assert $r.nil?
|
14
|
-
$r = RSRuby.instance()
|
6
|
+
def setup
|
7
|
+
@r = RSRuby.instance
|
15
8
|
end
|
16
9
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
def test_shutdown
|
11
|
+
tempdir = @r.tempdir.call
|
12
|
+
@r.postscript(tempdir+"/foo.ps")
|
13
|
+
@r.plot(1,1)
|
14
|
+
@r.dev_off.call
|
15
|
+
assert(File.exists?(tempdir))
|
16
|
+
@r.shutdown
|
17
|
+
assert(!File.exists?(tempdir))
|
21
18
|
end
|
19
|
+
|
22
20
|
end
|
data/test/tc_eval.rb
CHANGED
@@ -3,13 +3,17 @@ require 'rsruby'
|
|
3
3
|
|
4
4
|
class TestEval < Test::Unit::TestCase
|
5
5
|
|
6
|
+
def setup
|
7
|
+
@r = RSRuby.instance
|
8
|
+
end
|
9
|
+
|
6
10
|
def test_eval_R
|
7
11
|
#Test integer, Float, String and Boolean return values
|
8
|
-
assert_equal(
|
9
|
-
assert_equal(
|
10
|
-
assert_equal(
|
11
|
-
assert_equal(
|
12
|
-
assert_equal(
|
12
|
+
assert_equal(@r.eval_R("sum(1,2,3)"),6)
|
13
|
+
assert_equal(@r.eval_R("sum(1.5,2.5,3.5)"),7.5)
|
14
|
+
assert_equal(@r.eval_R("eval('R')"),"R")
|
15
|
+
assert_equal(@r.eval_R("is(1,'numeric')"),true)
|
16
|
+
assert_equal(@r.eval_R("is(1,'madeup')"),false)
|
13
17
|
end
|
14
18
|
|
15
19
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rsruby'
|
3
|
+
|
4
|
+
class TestNewCases < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_erobj
|
7
|
+
|
8
|
+
require 'rsruby/erobj'
|
9
|
+
r = RSRuby.instance
|
10
|
+
r.proc_table[lambda{|x| true}] = lambda{|x| ERObj.new(x)}
|
11
|
+
RSRuby.set_default_mode(RSRuby::PROC_CONVERSION)
|
12
|
+
|
13
|
+
f = r.c(1,2,3)
|
14
|
+
assert_equal('[1] 1 2 3',f.to_s)
|
15
|
+
assert_equal([1,2,3],f.to_ruby)
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_dataframe
|
20
|
+
|
21
|
+
r = RSRuby.instance
|
22
|
+
r.as_data_frame({'x' => [1,2,3], 'row.names' => ['a','b','c']})
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/test/tc_io.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rsruby'
|
3
3
|
|
4
|
-
unless $r
|
5
|
-
$r = RSRuby.instance
|
6
|
-
end
|
7
|
-
|
8
4
|
class DummyIO
|
9
5
|
def write
|
10
6
|
end
|
@@ -13,6 +9,7 @@ end
|
|
13
9
|
class TestIO < Test::Unit::TestCase
|
14
10
|
|
15
11
|
def setup
|
12
|
+
@r = RSRuby.instance
|
16
13
|
$stdout = $stderr = DummyIO.new
|
17
14
|
end
|
18
15
|
|
@@ -23,15 +20,15 @@ class TestIO < Test::Unit::TestCase
|
|
23
20
|
|
24
21
|
def test_io_stdin
|
25
22
|
dummy = lambda{|prompt,n| prompt+'\n'}
|
26
|
-
|
27
|
-
assert
|
23
|
+
@r.set_rsruby_input(dummy)
|
24
|
+
assert @r.readline('foo') == 'foo'
|
28
25
|
end
|
29
26
|
|
30
27
|
def test_io_stdout
|
31
28
|
out = []
|
32
29
|
dummy = lambda{|string| out.push(string)}
|
33
|
-
|
34
|
-
|
30
|
+
@r.set_rsruby_output(dummy)
|
31
|
+
@r.print(5)
|
35
32
|
assert out == ['[1]','5','\n']
|
36
33
|
end
|
37
34
|
|
@@ -40,8 +37,8 @@ class TestIO < Test::Unit::TestCase
|
|
40
37
|
dummy = lambda{|files,headers,title,delete|
|
41
38
|
out.push('foo')
|
42
39
|
}
|
43
|
-
|
44
|
-
|
40
|
+
@r.set_rsruby_showfiles(dummy)
|
41
|
+
@r.help()
|
45
42
|
assert out == ['foo']
|
46
43
|
end
|
47
44
|
|
data/test/tc_library.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rsruby'
|
3
3
|
|
4
|
-
unless $r
|
5
|
-
$r = RSRuby.instance
|
6
|
-
end
|
7
|
-
|
8
4
|
class TestLibrary < Test::Unit::TestCase
|
9
5
|
|
6
|
+
def setup
|
7
|
+
@r = RSRuby.instance
|
8
|
+
end
|
9
|
+
|
10
10
|
def test_library
|
11
11
|
#Test success
|
12
|
-
assert_nothing_raised(){
|
12
|
+
assert_nothing_raised(){@r.library("boot")}
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_library_fail
|
16
16
|
#Test failure
|
17
|
-
assert_raises(RException){
|
17
|
+
assert_raises(RException){@r.library("Missing")}
|
18
18
|
end
|
19
19
|
|
20
20
|
end
|
data/test/tc_modes.rb
CHANGED
@@ -1,38 +1,35 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rsruby'
|
3
3
|
|
4
|
-
unless $r
|
5
|
-
$r = RSRuby.instance
|
6
|
-
end
|
7
|
-
|
8
4
|
class TestModes < Test::Unit::TestCase
|
9
5
|
|
10
6
|
def setup
|
7
|
+
@r = RSRuby.instance
|
11
8
|
RSRuby.set_default_mode(RSRuby::NO_DEFAULT)
|
12
|
-
|
13
|
-
|
9
|
+
@r.class_table.clear
|
10
|
+
@r.proc_table.clear
|
14
11
|
end
|
15
12
|
|
16
13
|
def test_to_ruby_args
|
17
|
-
assert_raises(ArgumentError){
|
18
|
-
assert_raises(ArgumentError){
|
19
|
-
assert_raises(TypeError){
|
14
|
+
assert_raises(ArgumentError){@r.seq.to_ruby(RSRuby::TOP_CONVERSION+1)}
|
15
|
+
assert_raises(ArgumentError){@r.seq.to_ruby(-2)}
|
16
|
+
assert_raises(TypeError){@r.seq.to_ruby('foo')}
|
20
17
|
end
|
21
18
|
|
22
19
|
def test_to_ruby
|
23
|
-
|
24
|
-
four =
|
20
|
+
@r.c.autoconvert(RSRuby::NO_CONVERSION)
|
21
|
+
four = @r.c(4)
|
25
22
|
assert_equal(four.to_ruby, 4)
|
26
23
|
assert_equal(four.to_ruby(RSRuby::PROC_CONVERSION), 4)
|
27
24
|
assert_equal(four.to_ruby(RSRuby::BASIC_CONVERSION), 4)
|
28
25
|
assert_equal(four.to_ruby(RSRuby::VECTOR_CONVERSION), [4])
|
29
|
-
assert(
|
26
|
+
assert(@r["=="].call(four.to_ruby(RSRuby::NO_CONVERSION),four))
|
30
27
|
end
|
31
28
|
|
32
29
|
def test_to_ruby_default_arg
|
33
30
|
RSRuby.set_default_mode(RSRuby::NO_CONVERSION)
|
34
|
-
sequence =
|
35
|
-
t_test =
|
31
|
+
sequence = @r.seq(1,3)
|
32
|
+
t_test = @r.t_test([1,2,3])
|
36
33
|
|
37
34
|
assert_equal(sequence.to_ruby.class , RObj)
|
38
35
|
assert_equal(sequence.to_ruby.class, sequence.class)
|
@@ -43,11 +40,11 @@ class TestModes < Test::Unit::TestCase
|
|
43
40
|
RSRuby.set_default_mode(RSRuby::VECTOR_CONVERSION)
|
44
41
|
assert_equal(sequence.to_ruby, [1,2,3])
|
45
42
|
|
46
|
-
|
43
|
+
@r.class_table['htest'] = lambda{5}
|
47
44
|
RSRuby.set_default_mode(RSRuby::CLASS_CONVERSION)
|
48
45
|
assert_equal(t_test.to_ruby, 5)
|
49
46
|
|
50
|
-
|
47
|
+
@r.proc_table[lambda{true}] = lambda{return 6}
|
51
48
|
RSRuby.set_default_mode(RSRuby::PROC_CONVERSION)
|
52
49
|
assert_equal(t_test.to_ruby, 6)
|
53
50
|
end
|
@@ -73,50 +70,50 @@ class TestModes < Test::Unit::TestCase
|
|
73
70
|
end
|
74
71
|
|
75
72
|
def test_no_default_mode
|
76
|
-
|
77
|
-
|
78
|
-
|
73
|
+
@r.t_test.autoconvert(RSRuby::CLASS_CONVERSION)
|
74
|
+
@r.array.autoconvert(RSRuby::NO_CONVERSION)
|
75
|
+
@r.seq.autoconvert(RSRuby::BASIC_CONVERSION)
|
79
76
|
|
80
|
-
assert_equal(
|
77
|
+
assert_equal(@r.array(1,3).class, @r.array.class)
|
81
78
|
|
82
|
-
assert_equal(
|
83
|
-
|
84
|
-
assert_equal(
|
79
|
+
assert_equal(@r.seq(1,3), [1,2,3])
|
80
|
+
@r.class_table['htest'] = lambda{5}
|
81
|
+
assert_equal(@r.t_test([1,2,3]), 5)
|
85
82
|
end
|
86
83
|
|
87
84
|
def test_individual_conversions
|
88
|
-
|
89
|
-
|
90
|
-
|
85
|
+
@r.c.autoconvert(RSRuby::BASIC_CONVERSION)
|
86
|
+
@r.seq.autoconvert(RSRuby::PROC_CONVERSION)
|
87
|
+
@r.min.autoconvert(RSRuby::VECTOR_CONVERSION)
|
91
88
|
|
92
89
|
RSRuby.set_default_mode(RSRuby::NO_CONVERSION)
|
93
|
-
assert_equal(
|
94
|
-
assert_equal(
|
95
|
-
assert_equal(
|
90
|
+
assert_equal(@r.c(4).class, RObj)
|
91
|
+
assert_equal(@r.seq(1,3).class, RObj)
|
92
|
+
assert_equal(@r.min(1,3).class, RObj)
|
96
93
|
|
97
94
|
RSRuby.set_default_mode(RSRuby::NO_DEFAULT)
|
98
|
-
assert_equal(
|
99
|
-
assert_equal(
|
100
|
-
assert_equal(
|
101
|
-
assert_equal(
|
102
|
-
assert_equal(
|
103
|
-
assert_equal(
|
95
|
+
assert_equal(@r.c.autoconvert, RSRuby::BASIC_CONVERSION)
|
96
|
+
assert_equal(@r.seq.autoconvert, RSRuby::PROC_CONVERSION)
|
97
|
+
assert_equal(@r.min.autoconvert, RSRuby::VECTOR_CONVERSION)
|
98
|
+
assert_equal(@r.c(4), 4)
|
99
|
+
assert_equal(@r.seq(1,3), [1,2,3])
|
100
|
+
assert_equal(@r.min(1,3), [1])
|
104
101
|
|
105
102
|
RSRuby.set_default_mode(RSRuby::BASIC_CONVERSION)
|
106
|
-
assert_equal(
|
107
|
-
assert_equal(
|
108
|
-
assert_equal(
|
109
|
-
assert_equal(
|
110
|
-
assert_equal(
|
111
|
-
assert_equal(
|
103
|
+
assert_equal(@r.c.autoconvert, RSRuby::BASIC_CONVERSION)
|
104
|
+
assert_equal(@r.seq.autoconvert, RSRuby::PROC_CONVERSION)
|
105
|
+
assert_equal(@r.min.autoconvert, RSRuby::VECTOR_CONVERSION)
|
106
|
+
assert_equal(@r.c(4), 4)
|
107
|
+
assert_equal(@r.seq(1,3), [1,2,3])
|
108
|
+
assert_equal(@r.min(1,3), 1)
|
112
109
|
|
113
110
|
RSRuby.set_default_mode(RSRuby::VECTOR_CONVERSION)
|
114
|
-
assert_equal(
|
115
|
-
assert_equal(
|
116
|
-
assert_equal(
|
117
|
-
assert_equal(
|
118
|
-
assert_equal(
|
119
|
-
assert_equal(
|
111
|
+
assert_equal(@r.c.autoconvert, RSRuby::BASIC_CONVERSION)
|
112
|
+
assert_equal(@r.seq.autoconvert, RSRuby::PROC_CONVERSION)
|
113
|
+
assert_equal(@r.min.autoconvert, RSRuby::VECTOR_CONVERSION)
|
114
|
+
assert_equal(@r.c(4), [4])
|
115
|
+
assert_equal(@r.seq(1,3), [1,2,3])
|
116
|
+
assert_equal(@r.min(1,3), [1])
|
120
117
|
|
121
118
|
end
|
122
119
|
|
@@ -124,67 +121,67 @@ class TestModes < Test::Unit::TestCase
|
|
124
121
|
|
125
122
|
RSRuby.set_default_mode(RSRuby::VECTOR_CONVERSION)
|
126
123
|
|
127
|
-
assert_equal(
|
128
|
-
assert_equal(
|
129
|
-
assert_equal(
|
124
|
+
assert_equal(@r.c(true), [true])
|
125
|
+
assert_equal(@r.c(4) , [4])
|
126
|
+
assert_equal(@r.c('A') , ['A'])
|
130
127
|
|
131
|
-
assert_equal(
|
132
|
-
assert_equal(
|
133
|
-
assert_equal(
|
128
|
+
assert_equal(@r.c(1,'A',2), ['1','A','2'])
|
129
|
+
assert_equal(@r.c(:a => 1, :b => 'A', :c => 2), {'a' => '1', 'b' => 'A', 'c' => '2'})
|
130
|
+
assert_equal(@r.list(:a => 1, :b => 'A', :c => 2),
|
134
131
|
{'a' => [1], 'b' => ['A'], 'c' => [2]})
|
135
|
-
assert_equal(
|
132
|
+
assert_equal(@r.eval_R("x~y").class, RObj)
|
136
133
|
end
|
137
134
|
|
138
135
|
def test_basic_conversion
|
139
136
|
|
140
137
|
RSRuby.set_default_mode(RSRuby::BASIC_CONVERSION)
|
141
|
-
assert_equal(
|
142
|
-
assert_equal(
|
143
|
-
assert_equal(
|
138
|
+
assert_equal(@r.c(true), true)
|
139
|
+
assert_equal(@r.c(4), 4)
|
140
|
+
assert_equal(@r.c('A') , 'A')
|
144
141
|
|
145
|
-
assert_equal(
|
146
|
-
assert_equal(
|
147
|
-
assert_equal(
|
142
|
+
assert_equal(@r.c(1,'A',2), ['1','A','2'])
|
143
|
+
assert_equal(@r.c(:a => 1, :b => 'A', :c => 2), {'a' => '1', 'b' => 'A', 'c' => '2'})
|
144
|
+
assert_equal(@r.list(:a => 1, :b => 'A', :c => 2),
|
148
145
|
{'a' => 1, 'b' => 'A', 'c' => 2})
|
149
|
-
assert_equal(
|
146
|
+
assert_equal(@r.eval_R("x~y").class, RObj)
|
150
147
|
|
151
148
|
end
|
152
149
|
|
153
150
|
def test_class_table
|
154
151
|
|
155
|
-
|
156
|
-
|
157
|
-
if
|
152
|
+
@r.class_table['htest'] = lambda{'htest'}
|
153
|
+
@r.class_table['data.frame'] = lambda{|x|
|
154
|
+
if @r['[['].call(x,1).length > 2
|
158
155
|
return 5
|
159
156
|
else
|
160
157
|
return 'bar'
|
161
158
|
end
|
162
159
|
}
|
163
160
|
RSRuby.set_default_mode(RSRuby::CLASS_CONVERSION)
|
164
|
-
assert_equal(
|
165
|
-
assert_equal(
|
166
|
-
assert_equal(
|
161
|
+
assert_equal(@r.t_test([1,2,3]), 'htest')
|
162
|
+
assert_equal(@r.as_data_frame([1,2,3]), 5)
|
163
|
+
assert_equal(@r.as_data_frame([1,2]), 'bar')
|
167
164
|
|
168
165
|
end
|
169
166
|
|
170
167
|
def test_multiple_class_table
|
171
168
|
|
172
169
|
RSRuby.set_default_mode(RSRuby::NO_CONVERSION)
|
173
|
-
f =
|
174
|
-
g =
|
170
|
+
f = @r.class__(@r.c(4),'foo')
|
171
|
+
g = @r.class__(@r.c(4), ['bar','foo'])
|
175
172
|
|
176
|
-
|
177
|
-
|
178
|
-
|
173
|
+
@r.class_table['foo'] = lambda{'foo'}
|
174
|
+
@r.class_table['bar'] = lambda{'bar'}
|
175
|
+
@r.class_table[['bar','foo']] = lambda{5}
|
179
176
|
|
180
177
|
RSRuby.set_default_mode(RSRuby::CLASS_CONVERSION)
|
181
178
|
assert_equal(f.to_ruby, 'foo')
|
182
179
|
assert_equal(g.to_ruby, 5)
|
183
180
|
|
184
|
-
|
181
|
+
@r.class_table.delete(['bar','foo'])
|
185
182
|
assert_equal(g.to_ruby, 'bar')
|
186
183
|
|
187
|
-
|
184
|
+
@r.class_table.delete('bar')
|
188
185
|
assert_equal(g.to_ruby, 'foo')
|
189
186
|
|
190
187
|
end
|
@@ -192,7 +189,7 @@ class TestModes < Test::Unit::TestCase
|
|
192
189
|
def test_proc_table
|
193
190
|
|
194
191
|
t = lambda{|x|
|
195
|
-
e =
|
192
|
+
e = @r.attr(x,'names')
|
196
193
|
return false if e.nil?
|
197
194
|
if e == 'alternative' or e.include?('alternative')
|
198
195
|
return true
|
@@ -200,12 +197,67 @@ class TestModes < Test::Unit::TestCase
|
|
200
197
|
return false
|
201
198
|
end
|
202
199
|
}
|
203
|
-
f = lambda{|x|
|
200
|
+
f = lambda{|x| @r['$'].call(x,'alternative')}
|
204
201
|
|
205
|
-
|
202
|
+
@r.proc_table[t] = f
|
206
203
|
RSRuby.set_default_mode(RSRuby::NO_DEFAULT)
|
207
|
-
|
208
|
-
assert_equal(
|
204
|
+
@r.t_test.autoconvert(RSRuby::PROC_CONVERSION)
|
205
|
+
assert_equal(@r.t_test([1,2,3]), 'two.sided')
|
206
|
+
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_proc_convert
|
210
|
+
|
211
|
+
r = RSRuby.instance
|
212
|
+
|
213
|
+
check_str = lambda{|x| RSRuby.instance.is_character(x)}
|
214
|
+
f = lambda{|x|
|
215
|
+
x = x.to_ruby(RSRuby::BASIC_CONVERSION)
|
216
|
+
return "Cannot return 'foo'" if x == 'foo'
|
217
|
+
return x
|
218
|
+
}
|
219
|
+
|
220
|
+
r.proc_table[check_str] = f
|
221
|
+
|
222
|
+
RSRuby.set_default_mode(RSRuby::PROC_CONVERSION)
|
223
|
+
|
224
|
+
assert_equal('bar',r.c('bar'))
|
225
|
+
assert_equal("Cannot return 'foo'",r.c('foo'))
|
226
|
+
assert_equal(['bar','foo'],r.c('bar','foo'))
|
227
|
+
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_restore_mode_after_exception_in_proc
|
231
|
+
|
232
|
+
r = RSRuby.instance
|
233
|
+
|
234
|
+
check_str = lambda{|x| RSRuby.instance.is_character(x)}
|
235
|
+
f = lambda{|x|
|
236
|
+
x.reverse
|
237
|
+
}
|
238
|
+
|
239
|
+
r.proc_table[check_str] = f
|
240
|
+
|
241
|
+
RSRuby.set_default_mode(RSRuby::PROC_CONVERSION)
|
242
|
+
|
243
|
+
assert_equal(6,r.sum(1,2,3))
|
244
|
+
assert_equal(RSRuby::PROC_CONVERSION,RSRuby.get_default_mode)
|
245
|
+
assert_raise(NoMethodError){r.paste("foo","bar")}
|
246
|
+
assert_raise(NoMethodError){r.paste("foo","bar")}
|
247
|
+
assert_equal(RSRuby::PROC_CONVERSION,RSRuby.get_default_mode)
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_restore_mode_after_exception_in_class
|
252
|
+
|
253
|
+
r = RSRuby.instance
|
254
|
+
r.class_table['htest'] = lambda{|x| x.foo}
|
255
|
+
|
256
|
+
RSRuby.set_default_mode(RSRuby::CLASS_CONVERSION)
|
257
|
+
assert_equal(RSRuby::CLASS_CONVERSION,RSRuby.get_default_mode)
|
258
|
+
assert_raise(NoMethodError){r.t_test([1,2,3])}
|
259
|
+
assert_raise(NoMethodError){r.t_test([1,2,3])}
|
260
|
+
assert_equal(RSRuby::CLASS_CONVERSION,RSRuby.get_default_mode)
|
209
261
|
|
210
262
|
end
|
211
263
|
|