rserve-client 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +1 -2
- data/.gitignore +1 -0
- data/History.txt +15 -2
- data/Manifest.txt +8 -0
- data/README.txt +41 -19
- data/lib/rserve.rb +1 -1
- data/lib/rserve/connection.rb +152 -69
- data/lib/rserve/engine.rb +9 -9
- data/lib/rserve/packet.rb +2 -2
- data/lib/rserve/protocol.rb +51 -46
- data/lib/rserve/protocol/rexpfactory.rb +659 -366
- data/lib/rserve/rexp.rb +175 -156
- data/lib/rserve/rexp/double.rb +45 -38
- data/lib/rserve/rexp/environment.rb +40 -0
- data/lib/rserve/rexp/expressionvector.rb +9 -0
- data/lib/rserve/rexp/genericvector.rb +5 -3
- data/lib/rserve/rexp/integer.rb +38 -38
- data/lib/rserve/rexp/language.rb +2 -2
- data/lib/rserve/rexp/list.rb +3 -0
- data/lib/rserve/rexp/logical.rb +17 -4
- data/lib/rserve/rexp/null.rb +20 -14
- data/lib/rserve/rexp/raw.rb +19 -0
- data/lib/rserve/rexp/reference.rb +42 -0
- data/lib/rserve/rexp/s4.rb +10 -0
- data/lib/rserve/rexp/string.rb +5 -3
- data/lib/rserve/rexp/symbol.rb +3 -0
- data/lib/rserve/rexp/vector.rb +30 -15
- data/lib/rserve/rexp/wrapper.rb +58 -0
- data/lib/rserve/rfactor.rb +10 -10
- data/lib/rserve/rlist.rb +129 -100
- data/lib/rserve/talk.rb +61 -61
- data/spec/rserve_connection_spec.rb +99 -33
- data/spec/rserve_double_spec.rb +28 -15
- data/spec/rserve_integer_spec.rb +24 -15
- data/spec/rserve_logical_spec.rb +21 -12
- data/spec/rserve_protocol_spec.rb +7 -7
- data/spec/rserve_rexp_spec.rb +3 -3
- data/spec/rserve_rexp_wrapper_spec.rb +36 -0
- data/spec/rserve_rexpfactory_spec.rb +86 -20
- data/spec/rserve_rfactor_spec.rb +2 -2
- data/spec/rserve_rlist_spec.rb +53 -0
- data/spec/rserve_spec.rb +8 -5
- data/spec/rserve_talk_spec.rb +7 -7
- data/spec/spec_helper.rb +1 -0
- metadata +13 -3
- metadata.gz.sig +0 -0
data/lib/rserve/rfactor.rb
CHANGED
@@ -16,8 +16,8 @@ module Rserve
|
|
16
16
|
@index_base=index_base
|
17
17
|
end
|
18
18
|
# returns the level of a given case
|
19
|
-
|
20
|
-
|
19
|
+
# * @param i case number
|
20
|
+
# * @return name. may throw exception if out of range
|
21
21
|
def [](i)
|
22
22
|
li = @ids[i]-index_base
|
23
23
|
return (li<0 or li>levels.length) ? nil : levels[li]
|
@@ -26,16 +26,16 @@ module Rserve
|
|
26
26
|
li=level_index(li) if li.is_a? String
|
27
27
|
@ids.any? {|v| v==li}
|
28
28
|
end
|
29
|
-
|
30
|
-
|
29
|
+
|
30
|
+
# return the index of a given level name or -1 if it doesn't exist
|
31
31
|
def level_index(name)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
return nil if name.nil?
|
33
|
+
levels.length.times {|i|
|
34
|
+
return i+index_base if !levels[i].nil? and levels[i]==name
|
35
|
+
}
|
36
|
+
return nil
|
37
37
|
end
|
38
|
-
def count(li)
|
38
|
+
def count(li)
|
39
39
|
li=level_index(li) if li.is_a? String
|
40
40
|
@ids.inject(0) {|ac,v| ac+ ((v==li) ? 1 : 0 ) }
|
41
41
|
end
|
data/lib/rserve/rlist.rb
CHANGED
@@ -4,118 +4,147 @@ module Rserve
|
|
4
4
|
attr_reader :names
|
5
5
|
attr_reader :data
|
6
6
|
def initialize(data=nil,n=nil)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
else
|
16
|
-
raise ArgumentError
|
17
|
-
end
|
18
|
-
end
|
19
|
-
if n
|
20
|
-
@names=Array.new(@data.size)
|
21
|
-
n.each_index {|i| @names[i]=n[i]} if n.respond_to? :each_index
|
22
|
-
end
|
23
|
-
end
|
24
|
-
def named?
|
25
|
-
!@names.nil?
|
26
|
-
end
|
27
|
-
def [](v)
|
28
|
-
if v.is_a? String
|
29
|
-
return nil if @names.nil?
|
30
|
-
i=@names.index(v)
|
31
|
-
return i.nil? ? nil : @data[i]
|
32
|
-
elsif v.is_a? Integer
|
33
|
-
return @data[i]
|
7
|
+
@names=nil
|
8
|
+
@data=[]
|
9
|
+
if data
|
10
|
+
@data=case data
|
11
|
+
when Array
|
12
|
+
data
|
13
|
+
when Numeric
|
14
|
+
Array.new(data)
|
34
15
|
else
|
35
|
-
raise ArgumentError
|
16
|
+
raise ArgumentError
|
36
17
|
end
|
37
18
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
def key_at(v)
|
44
|
-
return nil if @names.nil?
|
45
|
-
@names[v]
|
19
|
+
if n
|
20
|
+
@names=Array.new(@data.size)
|
21
|
+
n.each_index {|i| @names[i]=n[i]} if n.respond_to? :each_index
|
46
22
|
end
|
47
|
-
|
48
|
-
|
23
|
+
end
|
24
|
+
def named?
|
25
|
+
!@names.nil?
|
26
|
+
end
|
27
|
+
def ==(o)
|
28
|
+
#p "Comparing #{self.inspect} with #{o.inspect} gives #{o.is_a? Rlist and self.data==o.data and self.names==o.names}"
|
29
|
+
o.is_a? Rlist and self.data==o.data and self.names==o.names
|
30
|
+
end
|
31
|
+
# Return element with name x or 0-index x
|
32
|
+
def [](v)
|
33
|
+
if v.is_a? String
|
34
|
+
return nil if @names.nil? or v==""
|
35
|
+
i=@names.index(v)
|
36
|
+
return i.nil? ? nil : @data[i]
|
37
|
+
elsif v.is_a? Integer
|
38
|
+
return @data[v]
|
39
|
+
else
|
40
|
+
raise ArgumentError,"Should be String or Integer"
|
49
41
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
42
|
+
end
|
43
|
+
|
44
|
+
def at(v)
|
45
|
+
self.[](v)
|
46
|
+
end
|
47
|
+
|
48
|
+
def key_at(v)
|
49
|
+
return nil if @names.nil?
|
50
|
+
@names[v]
|
51
|
+
end
|
52
|
+
def size
|
53
|
+
@data.size
|
54
|
+
end
|
55
|
+
|
56
|
+
def each
|
57
|
+
@data.each do |v|
|
58
|
+
yield v
|
55
59
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
if @names.size<size
|
62
|
-
(size-@names.size).times {@names.push(nil)}
|
63
|
-
end
|
64
|
-
|
65
|
-
@names[i]=value if i < size
|
66
|
-
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_key_at(i,value)
|
63
|
+
if @names.nil?
|
64
|
+
@names=Array.new
|
67
65
|
end
|
68
|
-
|
69
|
-
|
70
|
-
@names
|
66
|
+
if @names.size<size
|
67
|
+
(size-@names.size).times {@names.push(nil)}
|
71
68
|
end
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
i=size
|
87
|
-
@names=Array.new(i) if(@names.nil?)
|
88
|
-
@data.push(value)
|
89
|
-
@names.push(key)
|
90
|
-
|
69
|
+
|
70
|
+
@names[i]=value if i < size
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def keys
|
75
|
+
@names
|
76
|
+
end
|
77
|
+
|
78
|
+
def put(key,value)
|
79
|
+
puts "rlist.put(#{key},#{value})" if $DEBUG
|
80
|
+
if key.nil?
|
81
|
+
add(value)
|
82
|
+
return nil
|
91
83
|
end
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
@names.push(nil)
|
97
|
-
else
|
98
|
-
@data.insert(a,b)
|
99
|
-
@names.insert(a,nil)
|
84
|
+
if !@names.nil?
|
85
|
+
p=names.index(key)
|
86
|
+
if !p.nil?
|
87
|
+
return @names[p]=value
|
100
88
|
end
|
101
89
|
end
|
102
|
-
|
103
|
-
|
104
|
-
|
90
|
+
puts "add key and value" if $DEBUG
|
91
|
+
i=size
|
92
|
+
@names=Array.new(i) if(@names.nil?)
|
93
|
+
@data.push(value)
|
94
|
+
@names.push(key)
|
95
|
+
|
96
|
+
end
|
97
|
+
def add(a,b=nil)
|
98
|
+
if b.nil?
|
99
|
+
@data.push(a)
|
100
|
+
@names=Array.new(@data.size-1) if @names.nil?
|
101
|
+
@names.push(nil)
|
102
|
+
else
|
103
|
+
@data.insert(a,b)
|
104
|
+
@names.insert(a,nil)
|
105
105
|
end
|
106
|
-
|
107
|
-
|
106
|
+
end
|
107
|
+
def clear
|
108
|
+
@data.clear
|
109
|
+
@names=nil
|
110
|
+
end
|
111
|
+
def clone
|
112
|
+
RList.new(@data,@names)
|
113
|
+
end
|
114
|
+
def remove(elem)
|
115
|
+
if elem.is_a? String
|
116
|
+
i=@data.index(elem)
|
117
|
+
elsif elem.is_a? Integer
|
118
|
+
i=elem
|
108
119
|
end
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
120
|
+
return false if i.nil?
|
121
|
+
@data.delete_at(i)
|
122
|
+
@names.delete_at(i) unless @names.nil?
|
123
|
+
@names=nil if size==0
|
124
|
+
end
|
125
|
+
# Returns data with appropiate ruby representation
|
126
|
+
def to_a
|
127
|
+
@data.map {|d|
|
128
|
+
d.to_ruby
|
129
|
+
}
|
130
|
+
end
|
131
|
+
# Returns recursively a hash or array:
|
132
|
+
# * Unnamed list: returns an Array
|
133
|
+
# * Named List: returns a Hash. Every element without explicit name receive
|
134
|
+
# as key the number of element, 1-based
|
135
|
+
#
|
136
|
+
|
137
|
+
def to_ruby
|
138
|
+
if names.nil? or names.all? {|v| v.nil?}
|
139
|
+
to_a
|
140
|
+
else
|
141
|
+
h=Hash.new
|
142
|
+
names.each_with_index {|name,i|
|
143
|
+
key= (name=="" or name.nil?) ? i+1 : name
|
144
|
+
h[key]=@data[i].to_ruby
|
145
|
+
}
|
146
|
+
h
|
119
147
|
end
|
120
148
|
end
|
121
|
-
end
|
149
|
+
end
|
150
|
+
end
|
data/lib/rserve/talk.rb
CHANGED
@@ -3,7 +3,7 @@ module Rserve
|
|
3
3
|
#
|
4
4
|
# I separated the 'abstract' aspect of the protocol on
|
5
5
|
# Protocol module, for better testing
|
6
|
-
#
|
6
|
+
#
|
7
7
|
class Talk
|
8
8
|
include Rserve::Protocol
|
9
9
|
attr_reader :io
|
@@ -20,29 +20,29 @@ module Rserve
|
|
20
20
|
# @param :len number of bytes in cont to send (it is clipped to the length of cont if necessary)
|
21
21
|
# @return returned packet or <code>null</code> if something went wrong */
|
22
22
|
def request(params=Hash.new)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
if (offset>=cont.length)
|
23
|
+
|
24
|
+
cmd = params.delete :cmd
|
25
|
+
prefix = params.delete :prefix
|
26
|
+
cont = params.delete :cont
|
27
|
+
offset = params.delete :offset
|
28
|
+
len = params.delete :len
|
29
|
+
|
30
|
+
if cont.is_a? String
|
31
|
+
cont=request_string(cont)
|
32
|
+
elsif cont.is_a? Integer
|
33
|
+
cont=request_int(cont)
|
34
|
+
end
|
35
|
+
raise ArgumentError, ":cont should be an Enumerable" if !cont.nil? and !cont.is_a? Enumerable
|
36
|
+
if len.nil?
|
37
|
+
len=(cont.nil?) ? 0 : cont.length
|
38
|
+
end
|
39
|
+
|
40
|
+
offset||=0
|
41
|
+
|
42
|
+
|
43
|
+
if (!cont.nil?)
|
44
|
+
raise ":cont shouldn't contain anything but Fixnum" if cont.any? {|v| !v.is_a? Fixnum}
|
45
|
+
if (offset>=cont.length)
|
46
46
|
cont=nil;len=0
|
47
47
|
elsif (len>cont.length-offset)
|
48
48
|
len=cont.length-offset
|
@@ -51,8 +51,8 @@ module Rserve
|
|
51
51
|
offset=0 if offset<0
|
52
52
|
len=0 if len<0
|
53
53
|
contlen=(cont.nil?) ? 0 : len
|
54
|
-
contlen+=prefix.length if (!prefix.nil? and prefix.length>0)
|
55
|
-
|
54
|
+
contlen+=prefix.length if (!prefix.nil? and prefix.length>0)
|
55
|
+
|
56
56
|
hdr=Array.new(16)
|
57
57
|
set_int(cmd,hdr,0)
|
58
58
|
set_int(contlen,hdr,4);
|
@@ -63,48 +63,48 @@ module Rserve
|
|
63
63
|
io.write(prefix.pack("C*"))
|
64
64
|
puts "SEND PREFIX #{prefix}" if $DEBUG
|
65
65
|
end
|
66
|
-
if (!cont.nil?
|
67
|
-
|
68
|
-
|
66
|
+
if (!cont.nil? and cont.length>0)
|
67
|
+
puts "SEND CONTENT #{cont.slice(offset, len)} (#{offset},#{len})" if $DEBUG
|
68
|
+
io.write(cont.slice(offset, len).pack("C*"))
|
69
69
|
end
|
70
70
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
return Packet.new(rep,ct);
|
71
|
+
puts "Expecting 16 bytes..." if $DEBUG
|
72
|
+
ih=io.recv(16).unpack("C*")
|
73
|
+
|
74
|
+
return nil if (ih.length!=16)
|
75
|
+
|
76
|
+
puts "Answer: #{ih.to_s}" if $DEBUG
|
77
|
+
|
78
|
+
rep=get_int(ih,0);
|
79
|
+
|
80
|
+
rl =get_int(ih,4);
|
81
|
+
|
82
|
+
if $DEBUG
|
83
|
+
puts "rep: #{rep} #{rep.class} #{rep & 0x00FFFFFF}"
|
84
|
+
puts "rl: #{rl} #{rl.class}"
|
85
|
+
end
|
86
|
+
|
87
|
+
if (rl>0)
|
88
|
+
ct=Array.new();
|
89
|
+
n=0;
|
90
|
+
while (n<rl) do
|
91
|
+
data=io.recv(rl-n).unpack("C*")
|
92
|
+
ct+=data
|
93
|
+
rd=data.length
|
94
|
+
n+=rd;
|
98
95
|
end
|
99
|
-
|
100
|
-
return Packet.new(rep,
|
96
|
+
|
97
|
+
return Packet.new(rep,ct);
|
98
|
+
end
|
99
|
+
|
100
|
+
return Packet.new(rep,nil);
|
101
101
|
end
|
102
102
|
def request_string(s)
|
103
103
|
b=s.unpack("C*")
|
104
104
|
sl=b.length+1;
|
105
105
|
sl=(sl&0xfffffc)+4 if ((sl&3)>0) # make sure the length is divisible by 4
|
106
106
|
rq=Array.new(sl+5)
|
107
|
-
|
107
|
+
|
108
108
|
b.length.times {|i| rq[i+4]=b[i]}
|
109
109
|
((b.length)..sl).each {|i|
|
110
110
|
rq[i+4]=0
|
@@ -114,8 +114,8 @@ module Rserve
|
|
114
114
|
end
|
115
115
|
def request_int(par)
|
116
116
|
rq=Array.new(8)
|
117
|
-
|
118
|
-
|
117
|
+
set_int(par,rq,4)
|
118
|
+
set_hdr(DT_INT,4,rq,0)
|
119
119
|
rq
|
120
120
|
end
|
121
121
|
end
|
@@ -1,34 +1,34 @@
|
|
1
1
|
require File.dirname(__FILE__)+"/spec_helper.rb"
|
2
2
|
describe Rserve::Connection do
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
3
|
+
describe "opening and closing" do
|
4
|
+
before do
|
5
|
+
@r=Rserve::Connection.new()
|
6
|
+
end
|
7
|
+
it "should be open a connection and receive ID-String" do
|
8
|
+
@r.get_server_version.should==103
|
9
|
+
@r.protocol.should=="QAP1"
|
10
|
+
@r.last_error.should=="OK"
|
11
|
+
@r.rt.should be_instance_of(Rserve::Talk)
|
12
|
+
end
|
13
|
+
it "should raise ServerNotAvailable if started another instance on another port" do
|
14
|
+
lambda {Rserve::Connection.new(:port_number=>6700)}.should raise_exception(Rserve::Connection::ServerNotAvailable)
|
15
|
+
end
|
16
|
+
it "should quit correctly" do
|
17
|
+
@r.should be_connected
|
18
|
+
@r.close.should be_true
|
19
|
+
@r.should_not be_connected
|
20
|
+
@r.close.should be_true
|
21
|
+
end
|
22
|
+
it "raise an error if eval is clased after closed" do
|
23
|
+
@r.close
|
24
|
+
lambda {@r.eval("TRUE")}.should raise_exception(Rserve::Connection::NotConnected)
|
25
|
+
end
|
26
|
+
after do
|
27
|
+
@r.close if @r.connected?
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
describe "basic eval methods" do
|
32
32
|
before do
|
33
33
|
@r=Rserve::Connection.new
|
34
34
|
end
|
@@ -40,24 +40,90 @@ describe Rserve::Connection do
|
|
40
40
|
lambda {@r.void_eval("as.stt(c(1))")}.should raise_exception(Rserve::Connection::EvalError) {|e|
|
41
41
|
e.request_packet.stat.should==127}
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
it "method eval should return a simple object" do
|
45
45
|
la=@r.eval("TRUE")
|
46
46
|
la.should be_instance_of(Rserve::REXP::Logical)
|
47
47
|
la.true?.should==[true]
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it "method eval should raise an error with an incorrect expression" do
|
51
51
|
lambda {@r.eval("x<-")}.should raise_exception(Rserve::Connection::EvalError) {|e| e.request_packet.stat.should==2}
|
52
52
|
lambda {@r.eval("as.stt(c(1))")}.should raise_exception(Rserve::Connection::EvalError) {|e|
|
53
53
|
e.request_packet.stat.should==127}
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
it "should eval_void and eval correctly" do
|
57
57
|
@r.void_eval("x<-c(TRUE,FALSE)").should be_true
|
58
58
|
la=@r.eval("x")
|
59
59
|
la.should be_instance_of(Rserve::REXP::Logical)
|
60
|
-
la.true?.should==[true,false]
|
60
|
+
la.true?.should==[true,false]
|
61
|
+
end
|
62
|
+
it "should assign a string" do
|
63
|
+
@r.assign("x","a string")
|
64
|
+
@r.eval("x").to_ruby.should=="a string"
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
describe "assign using REXPs" do
|
69
|
+
before do
|
70
|
+
@r=Rserve::Connection.new
|
71
|
+
|
72
|
+
end
|
73
|
+
it "should assign double" do
|
74
|
+
rexp=Rserve::REXP::Double.new([1.5,-1.5])
|
75
|
+
@r.assign("x", rexp)
|
76
|
+
@r.eval("x").should==rexp
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should assign a null" do
|
80
|
+
rexp=Rserve::REXP::Null.new
|
81
|
+
@r.assign("x", rexp)
|
82
|
+
@r.eval("x").should==rexp
|
83
|
+
end
|
84
|
+
it "should assign a int vector" do
|
85
|
+
rexp=Rserve::REXP::Integer.new([1,2,3])
|
86
|
+
@r.assign("x", rexp)
|
87
|
+
@r.eval("x").should==rexp
|
88
|
+
end
|
89
|
+
it "should assign a bool vector" do
|
90
|
+
rexp=Rserve::REXP::Logical.new([1,0,1])
|
91
|
+
@r.assign("x", rexp)
|
92
|
+
@r.eval("x").should==rexp
|
93
|
+
end
|
94
|
+
it "should assign a string vector" do
|
95
|
+
rexp=Rserve::REXP::String.new(%w{a b c})
|
96
|
+
@r.assign("x", rexp)
|
97
|
+
@r.eval("x").should==rexp
|
98
|
+
end
|
99
|
+
it "should assign a list without names" do
|
100
|
+
rexp=Rserve::REXP::GenericVector.new(Rserve::Rlist.new([Rserve::REXP::String.new("a")]))
|
101
|
+
@r.assign("x", rexp)
|
102
|
+
@r.eval("x").should==rexp
|
103
|
+
end
|
104
|
+
it "should assign a list without names and nulls" do
|
105
|
+
rexp=Rserve::REXP::GenericVector.new(Rserve::Rlist.new([Rserve::REXP::Null.new]))
|
106
|
+
@r.assign("x", rexp)
|
107
|
+
@r.eval("x").should==rexp
|
108
|
+
end
|
109
|
+
it "should assign a list with names" do
|
110
|
+
x=@r.eval("list(a=TRUE)")
|
111
|
+
@r.assign("x",x)
|
112
|
+
@r.eval("x").should==x
|
113
|
+
end
|
114
|
+
it "should assign a data.frame" do
|
115
|
+
x=@r.eval("data.frame(a=rnorm(100),b=rnorm(100))")
|
116
|
+
@r.assign("x",x)
|
117
|
+
@r.eval("x").should==x
|
118
|
+
end
|
119
|
+
it "should assign a matrix" do
|
120
|
+
x=@r.eval("matrix(1:9,3,3)")
|
121
|
+
@r.assign("x",x)
|
122
|
+
@r.eval("x").should==x
|
123
|
+
|
124
|
+
end
|
125
|
+
after do
|
126
|
+
@r.void_eval("rm(x)")
|
61
127
|
end
|
62
128
|
end
|
63
129
|
end
|