rserve-client 0.1.3 → 0.1.4

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.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,7 @@
1
+ === 0.1.4 / 2010-05-24
2
+ * Bug fix: Incorrect NA for Logical, String and Double Vector
3
+ * Factors implemented
4
+
1
5
  === 0.1.3 / 2010-05-24
2
6
  * Better README.txt
3
7
  * Implemented hash of options on Connection.new
data/Rakefile CHANGED
@@ -6,6 +6,7 @@ require 'rserve'
6
6
  Hoe.plugin :git
7
7
  Hoe.spec 'rserve-client' do
8
8
  self.testlib=:rspec
9
+ self.test_globs="spec/*_spec.rb"
9
10
  self.version=Rserve::VERSION
10
11
  self.rubyforge_name = 'ruby-statsample' # if different than 'rserve'
11
12
  self.developer('Claudio Bustos', 'clbustos_AT_gmail.com')
@@ -1,7 +1,7 @@
1
1
  require 'socket'
2
2
 
3
3
  module Rserve
4
- VERSION = '0.1.3'
4
+ VERSION = '0.1.4'
5
5
  end
6
6
 
7
7
 
@@ -12,3 +12,5 @@ require 'rserve/rexp'
12
12
  require 'rserve/engine'
13
13
  require 'rserve/connection'
14
14
  require 'rserve/rlist'
15
+ require 'rserve/rfactor'
16
+
@@ -177,8 +177,9 @@ module Rserve
177
177
  d=Array.new(as)
178
178
  (eox-i).times {|i| d[i]=buf[o+i]}
179
179
  o=eox
180
+
180
181
  d.length.each {|j|
181
- if d[j]!=0 && d[j]!=1
182
+ if d[j]!=0 and d[j]!=1
182
183
  d[j]==REXP::Logical::NA
183
184
  end
184
185
  }
@@ -190,9 +191,11 @@ module Rserve
190
191
  o+=4
191
192
  d=Array.new(as)
192
193
  as.times {|i| d[i]=buf[o+i]}
193
- d.length.times {|j|
194
- if d[j]!=0 && d[j]!=1
195
- d[j]==REXP::Logical::NA
194
+ d.collect! {|v|
195
+ if v!=0 and v!=1
196
+ REXP::Logical::NA
197
+ else
198
+ v
196
199
  end
197
200
  }
198
201
  o=eox
@@ -227,9 +227,10 @@ end
227
227
 
228
228
  require 'rserve/rexp/vector'
229
229
  require 'rserve/rexp/null'
230
-
231
230
  require 'rserve/rexp/genericvector'
232
231
  require 'rserve/rexp/integer'
232
+ require 'rserve/rexp/factor'
233
+
233
234
  require 'rserve/rexp/double'
234
235
  require 'rserve/rexp/list'
235
236
  require 'rserve/rexp/language'
@@ -2,7 +2,8 @@ module Rserve
2
2
  class REXP
3
3
  class Double < REXP::Vector
4
4
  attr_reader :payload
5
- NA = 0x7ff00000000007a2;
5
+ # In Java, you only need to add L at last :(
6
+ NA = 0x100000000007a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6
7
  def initialize(data, attrs=nil)
7
8
  @payload=case data
8
9
  when Numeric
@@ -13,12 +13,13 @@ module Rserve
13
13
  @payload.map {|v| v==NA}
14
14
  end
15
15
  end
16
+ # l should be a value or array of 0 and 1.
16
17
  def initialize(l,attr=nil)
17
18
  super(attr)
18
19
  if l.is_a? Array
19
- @payload=l.map {|l| l==1 ? TRUE : FALSE}
20
+ @payload= l
20
21
  else
21
- @payload = [ l==1 ? TRUE : FALSE ]
22
+ @payload = [ l==NA ? NA : (l==1 ? TRUE : FALSE) ]
22
23
  end
23
24
  end
24
25
  def length
@@ -27,6 +28,9 @@ module Rserve
27
28
  def logical?
28
29
  true
29
30
  end
31
+ def as_bytes
32
+ @payload
33
+ end
30
34
  def as_integers
31
35
  @payload.map {|v| v==NA ? REXP::Integer::NA : ( v == FALSE ? 0 : 1 )}
32
36
  end
@@ -41,7 +45,6 @@ module Rserve
41
45
  end
42
46
  def false?
43
47
  @payload.map {|v| v==FALSE}
44
-
45
48
  end
46
49
  end
47
50
  end
@@ -22,7 +22,7 @@ module Rserve
22
22
  end
23
23
 
24
24
  def na?
25
- @payload.map {|v| v.nil}
25
+ @payload.map {|v| v=='NA'}
26
26
  end
27
27
  def to_debug_string
28
28
  t=super
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__)+"/spec_helper.rb"
2
+
3
+ describe Rserve::REXP::Integer do
4
+ describe "initialization" do
5
+ it "should accept array as payload" do
6
+ payload=[0,1,0]
7
+ a=Rserve::REXP::Logical.new(payload)
8
+ a.payload.should==payload
9
+ end
10
+ it "should accept a single value as payload" do
11
+ payload=1
12
+ a=Rserve::REXP::Logical.new(payload)
13
+ a.payload.should==[ Rserve::REXP::Logical::TRUE ]
14
+ end
15
+ end
16
+ describe "common methods" do
17
+ before do
18
+ @n=rand(100)
19
+ @payload=@n.times.map {rand(2)}
20
+ @a=Rserve::REXP::Logical.new(@payload)
21
+ end
22
+ subject {@a}
23
+ it "should return correct length of payload" do
24
+ @a.length.should==@n
25
+ end
26
+ it {should be_logical}
27
+ it "method as_bytes should return payload" do
28
+ @a.as_bytes.should==@payload
29
+ end
30
+ it "method as_integer should return integers" do
31
+ @a.as_integers.should==@payload.map {|v| v==Rserve::REXP::Logical::TRUE ? 1 : 0}
32
+ end
33
+ it "method as_doubles should return floats" do
34
+ @a.as_doubles.should==@payload.map {|v| v==Rserve::REXP::Logical::TRUE ? 1.0 : 0.0}
35
+ end
36
+ it "method as_string should return string" do
37
+ @a.as_strings.should==@payload.map {|v| v==Rserve::REXP::Logical::TRUE ? "TRUE" : "FALSE"}
38
+ end
39
+ it "method true? should return an array with true for TRUE values" do
40
+ @a.true?.should==@payload.map {|v| v==Rserve::REXP::Logical::TRUE ? true :false}
41
+ end
42
+ it "method false? should return an array with true for FALSE values" do
43
+ @a.false?.should==@payload.map {|v| v==Rserve::REXP::Logical::FALSE ? true :false}
44
+ end
45
+
46
+ it "method is_NA should return coherent answer" do
47
+ payload=[1,Rserve::REXP::Logical::NA, 0]
48
+ a=Rserve::REXP::Logical.new(payload)
49
+ a.na?.should==[false,true,false]
50
+ a.na?(a.as_bytes[0]).should be_false
51
+ a.na?(a.as_bytes[1]).should be_true
52
+ end
53
+ it "method to_debug_string and to_s returns a coherent response" do
54
+ @a.to_debug_string.size.should>0
55
+ @a.to_s.size.should>0
56
+
57
+ end
58
+ end
59
+
60
+
61
+ end
@@ -16,6 +16,11 @@ describe Rserve::Protocol::REXPFactory do
16
16
  la.should be_instance_of(Rserve::REXP::Logical)
17
17
  la.true?.should==[true,false,true]
18
18
  end
19
+ it "should process logical vectors with NA" do
20
+ la=@r.eval("c(TRUE,NA)")
21
+ la.should be_instance_of(Rserve::REXP::Logical)
22
+ la.na?.should==[false,true]
23
+ end
19
24
  it "should process single double" do
20
25
  la=@r.eval("1.5")
21
26
  la.should be_instance_of(Rserve::REXP::Double)
@@ -30,11 +35,38 @@ describe Rserve::Protocol::REXPFactory do
30
35
  v.should be_close(a[i],1e-10)
31
36
  }
32
37
  end
33
- it "should process char" do
38
+ it "should process double vector with NA" do
39
+ la=@r.eval("c(1,NA)")
40
+ la.should be_instance_of(Rserve::REXP::Double)
41
+ la.na?.should==[false,true]
42
+
43
+ end
44
+ it "should process string vector" do
34
45
  la=@r.eval("c('abc','def','ghi')")
35
46
  la.should be_instance_of(Rserve::REXP::String)
36
47
  la.as_strings.should==['abc','def','ghi']
37
48
  end
49
+ it "should process string vector with NA" do
50
+ la=@r.eval("c('abc','def',NA)")
51
+ la.should be_instance_of(Rserve::REXP::String)
52
+ la.na?.should==[false,false,true]
53
+
54
+ end
55
+ it "should process factor" do
56
+ la=@r.eval <<-EOF
57
+ state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
58
+ "qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
59
+ "sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
60
+ "sa", "act", "nsw", "vic", "vic", "act");
61
+ statef <- factor(state)
62
+ EOF
63
+ la.should be_factor
64
+ la.as_factor.levels.sort.should==%w{act nsw nt qld sa tas vic wa}.sort
65
+
66
+ la.as_factor.contains?("tas").should be_true
67
+ la.as_factor.contains?("nn").should be_false
68
+
69
+ end
38
70
  it "should process list" do
39
71
  require 'pp'
40
72
  la=@r.eval("list(name='Fred',age=30,10,20,kids=c(1,2,3))")
@@ -0,0 +1,45 @@
1
+ require File.dirname(__FILE__)+"/spec_helper.rb"
2
+
3
+ describe Rserve::RFactor do
4
+ before do
5
+ @levels=['a','b','c','d']
6
+ @ids=[1,1,2,2,3,3,4]
7
+ @base_index=1
8
+ @factor=Rserve::RFactor.new(@ids,@levels,false,@base_index)
9
+ end
10
+ it "method size should return number of ids" do
11
+ @factor.size.should==@ids.size
12
+ end
13
+ it "method [] should return correct value (1 based)" do
14
+ @ids.each_index {|i|
15
+ @factor[i].should == @levels[@ids[i]-@base_index]
16
+ @factor[1].should=='a'
17
+ @factor[3].should=='b'
18
+ @factor[5].should=='c'
19
+
20
+ }
21
+ end
22
+ it "methods contains? should work with integers and strings" do
23
+ @factor.contains?(1).should be_true
24
+ @factor.contains?(5).should be_false
25
+ @factor.contains?('a').should be_true
26
+ @factor.contains?('z').should be_false
27
+ end
28
+ it "methods count should work with integers and strings" do
29
+ @factor.count(2).should==2
30
+ @factor.count(5).should==0
31
+ @factor.count('a').should==2
32
+ @factor.count('z').should==0
33
+ end
34
+ it "method counts_hash should return correct value" do
35
+ @factor.counts_hash.should=={'a'=>2,'b'=>2,'c'=>2,'d'=>1}
36
+ end
37
+ it "method as_integers should return correct values" do
38
+ @factor.as_integers.should==@ids
39
+ end
40
+
41
+ it "method as_strings should return correct values" do
42
+ @factor.as_strings==%w{a a b b c c d}
43
+ end
44
+
45
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 3
9
- version: 0.1.3
8
+ - 4
9
+ version: 0.1.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Claudio Bustos
@@ -149,5 +149,15 @@ rubygems_version: 1.3.6
149
149
  signing_key:
150
150
  specification_version: 3
151
151
  summary: Ruby client for Rserve, a Binary R server (http://www.rforge.net/Rserve/)
152
- test_files: []
153
-
152
+ test_files:
153
+ - spec/rserve_rfactor_spec.rb
154
+ - spec/rserve_connection_spec.rb
155
+ - spec/rserve_double_spec.rb
156
+ - spec/rserve_packet_spec.rb
157
+ - spec/rserve_rexpfactory_spec.rb
158
+ - spec/rserve_rexp_spec.rb
159
+ - spec/rserve_integer_spec.rb
160
+ - spec/rserve_spec.rb
161
+ - spec/rserve_protocol_spec.rb
162
+ - spec/rserve_logical_spec.rb
163
+ - spec/rserve_talk_spec.rb
metadata.gz.sig CHANGED
Binary file