rsruby 0.4.0 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|