R4rb 1.0.0
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.
- checksums.yaml +7 -0
- data/R4rb.gemspec +32 -0
- data/Rakefile +114 -0
- data/ext/R4rb/MANIFEST +0 -0
- data/ext/R4rb/R4rb.c +595 -0
- data/ext/R4rb/extconf.rb +133 -0
- data/lib/R2rb.rb +5 -0
- data/lib/R4rb.rb +59 -0
- data/lib/R4rb/R2rb_eval.rb +116 -0
- data/lib/R4rb/R2rb_init.rb +109 -0
- data/lib/R4rb/R4rb.rb +164 -0
- data/lib/R4rb/Rserve.rb +208 -0
- data/lib/R4rb/converter.rb +69 -0
- data/lib/R4rb/init.rb +127 -0
- data/lib/R4rb/robj.rb +46 -0
- data/lib/Rserve.rb +8 -0
- data/script/README +5 -0
- data/script/Rserv +39 -0
- data/script/install_Rserv +8 -0
- data/test/R4rbRserve.rb +30 -0
- data/test/compR4rbRserve.rb +2 -0
- data/test/test.rb +89 -0
- data/test/testArray.rb +27 -0
- data/test/testBuffer.rb +12 -0
- data/test/testConsole.rb +5 -0
- data/test/testR4rb.rb +42 -0
- data/test/testRVect.rb +18 -0
- data/test/testRserve.rb +90 -0
- data/test/test_error.rb +32 -0
- metadata +74 -0
data/ext/R4rb/extconf.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mkmf"
|
3
|
+
require 'fileutils' #if RUBY_VERSION < "1.9"
|
4
|
+
|
5
|
+
# TODO: specify a file R4rb.conf to provide multiple R systems location
|
6
|
+
# in lib/R4rb.rb read this file to offer the several choices
|
7
|
+
|
8
|
+
def find_installed_R
|
9
|
+
|
10
|
+
if RUBY_PLATFORM=~/mingw/ or RUBY_PLATFORM=~/msys/
|
11
|
+
$prefix=`R RHOME`.gsub("\\","/")
|
12
|
+
$prefix_include=$prefix+"/include"
|
13
|
+
$prefix_lib=nil
|
14
|
+
(RUBY_PLATFORM=~/64/ ? ["","x64"] : ["","i386"]).each do |arch|
|
15
|
+
$prefix_lib=File.join($prefix,"bin",arch) if File.exists? File.join($prefix,"bin",arch,"R.dll")
|
16
|
+
#$versions=[arch]
|
17
|
+
break if $prefix_lib
|
18
|
+
end
|
19
|
+
elsif RUBY_PLATFORM=~/darwin/
|
20
|
+
versions="/Library/Frameworks/R.framework/Versions"
|
21
|
+
if File.directory? versions
|
22
|
+
$prefix=Dir[versions+"/*/Resources"].select{|e| e.split("/")[-2]!="Current"}
|
23
|
+
$prefix_include=$prefix.map{|e| e+"/include"}
|
24
|
+
$prefix_lib=$prefix.map{|e| e+"/lib"}
|
25
|
+
$versions=$prefix.map{|e| e.split("/")[-2]}
|
26
|
+
else
|
27
|
+
$prefix=`R RHOME`.strip
|
28
|
+
$prefix_include=$prefix+"/include"
|
29
|
+
$prefix_lib=$prefix+"/lib"
|
30
|
+
end
|
31
|
+
|
32
|
+
else
|
33
|
+
stddirs=["/usr/local/lib/R","/usr/lib/R","/usr/share/R","/usr/include/R","/usr/lib64/R"]
|
34
|
+
stddirs.unshift `R RHOME`.strip.split("\n").select{|l| l=~/^\//}[0] unless `R RHOME`.empty?
|
35
|
+
usrdirs = []
|
36
|
+
ARGV.each do |arg|
|
37
|
+
if arg =~ /--with-R/
|
38
|
+
option, value = arg.split('=')
|
39
|
+
usrdirs = [ value ] + usrdirs
|
40
|
+
end
|
41
|
+
end
|
42
|
+
dirs = usrdirs + stddirs
|
43
|
+
dirs.uniq! # remove duplicates
|
44
|
+
|
45
|
+
$prefix,$prefix_include,$prefix_lib=nil,nil,nil
|
46
|
+
|
47
|
+
dirs.each do |dir|
|
48
|
+
p dir
|
49
|
+
if !$prefix and FileTest.exists?(dir)
|
50
|
+
$prefix = dir[0..-3]
|
51
|
+
end
|
52
|
+
|
53
|
+
if !$prefix_include and FileTest.exists?(dir+"/include/R.h")
|
54
|
+
$prefix_include=dir+"/include"
|
55
|
+
end
|
56
|
+
|
57
|
+
if !$prefix_include and FileTest.exists?(dir+"/R.h")
|
58
|
+
$prefix_include=dir
|
59
|
+
end
|
60
|
+
|
61
|
+
if !$prefix_lib and FileTest.exists?(dir+"/lib/libR.so")
|
62
|
+
$prefix_lib=dir+"/lib"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
raise RuntimeError, "couldn't find R Home : R seems to be uninstalled!!" unless $prefix
|
66
|
+
raise RuntimeError, "couldn't find R.h!!" unless $prefix_include
|
67
|
+
raise RuntimeError, "couldn't find libR.so!!" unless $prefix_lib
|
68
|
+
#return multi
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def r4rb_makefile(inc,lib,version=nil)
|
75
|
+
$CFLAGS = "-I"+inc+" -I."
|
76
|
+
$LDFLAGS = "-L"+lib if lib
|
77
|
+
$libs = "-lR"
|
78
|
+
|
79
|
+
header = nil
|
80
|
+
|
81
|
+
rb4r_name="R4rb"+((version and version!="orig") ? "."+version : "" )
|
82
|
+
$objs = [rb4r_name+".o"]
|
83
|
+
|
84
|
+
dir_config("R4rb")
|
85
|
+
create_makefile(rb4r_name)
|
86
|
+
File.rename("Makefile", "Makefile-#{version}")
|
87
|
+
end
|
88
|
+
|
89
|
+
## R is installed?
|
90
|
+
find_installed_R
|
91
|
+
|
92
|
+
$versions=["orig"] unless $versions
|
93
|
+
$prefix,$prefix_include,$prefix_lib=[$prefix],[$prefix_include],[$prefix_lib] unless $prefix.is_a? Array
|
94
|
+
|
95
|
+
modules = ""
|
96
|
+
|
97
|
+
p $versions
|
98
|
+
|
99
|
+
File.unlink("Makefile") if (FileTest.exist? "Makefile")
|
100
|
+
$versions.each_with_index {|version,i|
|
101
|
+
File.unlink("Makefile-#{version}") if (FileTest.exist? "Makefile-#{version}")
|
102
|
+
r4rb_makefile($prefix_include[i],$prefix_lib[i],version)
|
103
|
+
rb4r_name="R4rb"+((version and version!="orig") ? "."+version : "" )
|
104
|
+
modules += " #{rb4r_name}.#{CONFIG['DLEXT']}"
|
105
|
+
FileUtils.cp "R4rb.c", "#{rb4r_name}.c" if "R4rb.c" != "#{rb4r_name}.c"
|
106
|
+
}
|
107
|
+
|
108
|
+
open("Makefile", "w") {|f|
|
109
|
+
v = $nmake ? '{$(srcdir)}' : ''
|
110
|
+
f << "SHELL = /bin/sh" + "\n"
|
111
|
+
f << "srcdir = #{$srcdir}" + "\n"
|
112
|
+
f << "VPATH = $(srcdir)" + "\n"
|
113
|
+
|
114
|
+
f << "all: #{modules}" + "\n\n"
|
115
|
+
|
116
|
+
$versions.each do |version|
|
117
|
+
rb4r_name="R4rb"+((version and version!="orig") ? "."+version : "" )
|
118
|
+
f << "#{rb4r_name}.#{CONFIG['DLEXT']}: #{v}#{rb4r_name}.c" + "\n"
|
119
|
+
f << "\t@echo Now Making R4rb-#{version} extend module" + "\n"
|
120
|
+
f << "\t@$(MAKE) -f Makefile-#{version}" + "\n\n"
|
121
|
+
end
|
122
|
+
|
123
|
+
["clean","distclean","install","site-install"].each do |task|
|
124
|
+
f << "#{task}:"
|
125
|
+
f << " "+modules if ["install","site-install"].include? task
|
126
|
+
f << "\n"
|
127
|
+
$versions.each do |version|
|
128
|
+
f << "\t@$(MAKE) -f Makefile-#{version} #{task}" + "\n"
|
129
|
+
end
|
130
|
+
f << "\n"
|
131
|
+
end
|
132
|
+
|
133
|
+
}
|
data/lib/R2rb.rb
ADDED
data/lib/R4rb.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
Encoding.default_external = Encoding::UTF_8 unless RUBY_VERSION =~ /1\.8/
|
3
|
+
# loading library: compatible for ruby-1.8.7, ruby-1.9.3, ruby-2.0.0
|
4
|
+
if RUBY_PLATFORM=~/mingw32/ #because I did not manage to execute the same on mingw32
|
5
|
+
# cmd=begin `Rscript`; rescue; "undefined";end
|
6
|
+
# unless cmd=="undefined"
|
7
|
+
# cmd="Rscript.exe"
|
8
|
+
# version=`#{cmd} -e "cat(R.version$major,R.version$minor,sep='.')"`
|
9
|
+
# else
|
10
|
+
# if File.exists? (jsonfile=File.join(ENV["HOME"],"dyndoc","studio","win32","dyndoc.json"))
|
11
|
+
# require 'json'
|
12
|
+
# version=JSON.parse(File.read(jsonfile))["Rversion"]
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
version=nil
|
16
|
+
else
|
17
|
+
version=`Rscript -e 'cat(R.version$major,R.version$minor,sep=".")'`
|
18
|
+
version=version.split(".")[0...2].join(".")
|
19
|
+
#puts version
|
20
|
+
end
|
21
|
+
|
22
|
+
found=nil
|
23
|
+
[".bundle",".so"].each do |ext|
|
24
|
+
["","../ext/R4rb"].each do |path| #sometimes in lib sometimes in ext/R4rb/
|
25
|
+
lib=File.join(File.dirname(__FILE__),path,'R4rb'+(version ? '.'+version+ext : ext ) )
|
26
|
+
if File.exists? lib
|
27
|
+
puts "#{lib} found"
|
28
|
+
require lib
|
29
|
+
puts "#{lib} loaded"
|
30
|
+
found=true
|
31
|
+
break
|
32
|
+
end
|
33
|
+
end
|
34
|
+
break if found
|
35
|
+
end
|
36
|
+
|
37
|
+
# unless found #windows case
|
38
|
+
# ["i386","x64"].each do |version|
|
39
|
+
# ["","../ext/R4rb"].each do |path|
|
40
|
+
# lib=File.join(File.dirname(__FILE__),path,'R4rb.'+version+'.so')
|
41
|
+
# if File.exists? lib
|
42
|
+
# puts "#{lib} found"
|
43
|
+
# require lib
|
44
|
+
# found=true
|
45
|
+
# break
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
|
51
|
+
require 'R4rb.so' unless found
|
52
|
+
|
53
|
+
# loading ruby files
|
54
|
+
require 'R4rb/R2rb_init'
|
55
|
+
require 'R4rb/R2rb_eval'
|
56
|
+
require 'R4rb/robj'
|
57
|
+
require 'R4rb/Rserve'
|
58
|
+
require 'R4rb/converter'
|
59
|
+
require 'R4rb/R4rb'
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
## Module R2rb
|
3
|
+
|
4
|
+
module R2rb
|
5
|
+
def R2rb.eval(s,aff=nil)
|
6
|
+
s=["{\n"+s+"}\n"]
|
7
|
+
evalLines s,aff
|
8
|
+
end
|
9
|
+
|
10
|
+
def R2rb.parse(s,aff=nil)
|
11
|
+
s=["{\n"+s+"}\n"]
|
12
|
+
parseLines s,aff
|
13
|
+
end
|
14
|
+
|
15
|
+
def R2rb.try_eval(code)
|
16
|
+
try_code=".result_try_code<-try({\n"+code+"\n},silent=TRUE)\n.result_try_code"
|
17
|
+
R2rb << try_code
|
18
|
+
puts ".result_try_code".to_R if "inherits(.result_try_code,'try-error')".to_R
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def R2rb.<<(s)
|
23
|
+
R2rb.eval(s)
|
24
|
+
end
|
25
|
+
|
26
|
+
class RVector
|
27
|
+
|
28
|
+
def <<(name)
|
29
|
+
if name.is_a? Symbol
|
30
|
+
@name=name.to_s
|
31
|
+
@type="var"
|
32
|
+
else
|
33
|
+
@name=name
|
34
|
+
@type="expr"
|
35
|
+
end
|
36
|
+
return self
|
37
|
+
end
|
38
|
+
|
39
|
+
def arg=(arg)
|
40
|
+
@arg=arg
|
41
|
+
end
|
42
|
+
|
43
|
+
#this method is the same as the previous one but return self! Let us notice that even by adding return self in the previous one
|
44
|
+
# I could not manage to execute (rvect.arg="[2]").value_with_arg but fortunately rvect.set_arg("[2]").value_with_arg is working!
|
45
|
+
def set_arg(arg)
|
46
|
+
@arg=arg
|
47
|
+
return self
|
48
|
+
end
|
49
|
+
|
50
|
+
def >(arr)
|
51
|
+
res=self.get
|
52
|
+
#puts "res";p @name;p res
|
53
|
+
if res
|
54
|
+
#puts "arr.class:";p arr.class
|
55
|
+
#puts "res.class";p res.class
|
56
|
+
res=[res] unless res.is_a? Array
|
57
|
+
arr.replace(res)
|
58
|
+
else
|
59
|
+
arr.clear
|
60
|
+
end
|
61
|
+
return self
|
62
|
+
end
|
63
|
+
|
64
|
+
=begin #Done directly inside R4rb.c
|
65
|
+
def value_with_arg(arg)
|
66
|
+
old_name,old_type=@name.dup,@type.dup
|
67
|
+
@name,@type=@name+arg,"expr"
|
68
|
+
value
|
69
|
+
@name,@type=old_name,old_type
|
70
|
+
end
|
71
|
+
=end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
@@out=[]
|
76
|
+
##@@out.rb2R=R2rb
|
77
|
+
|
78
|
+
def R2rb.<(rcode)
|
79
|
+
@@out.replace [] ##@@out=[] #important! it could otherwise remove
|
80
|
+
@@out.rb2R=self
|
81
|
+
@@out < rcode.to_s ##@@out.inR2rb rcode.to_s
|
82
|
+
return (@@out.length<=1 ? @@out[0] : @@out)
|
83
|
+
end
|
84
|
+
|
85
|
+
class << self
|
86
|
+
alias output <
|
87
|
+
end
|
88
|
+
|
89
|
+
class Server
|
90
|
+
@@in,@@out=nil,[]
|
91
|
+
|
92
|
+
def Server.in
|
93
|
+
return @@in
|
94
|
+
end
|
95
|
+
|
96
|
+
def Server.in=(block)
|
97
|
+
@@in=block
|
98
|
+
end
|
99
|
+
|
100
|
+
def Server.<<(block)
|
101
|
+
@@in << block
|
102
|
+
end
|
103
|
+
|
104
|
+
def Server.out
|
105
|
+
return @@out.join("\n")
|
106
|
+
end
|
107
|
+
|
108
|
+
def Server.echo(block=nil)
|
109
|
+
@@in=block if block
|
110
|
+
R2rb << ".output<<-capture.output({"+@@in+"})"
|
111
|
+
return (@@out < '.output').join("\n")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
## Attention "...\n..." have to be replaced by "...\\n..."
|
4
|
+
## example : 'cat("toto\n")' fails but not 'cat("toto\\n")'
|
5
|
+
## more surprisingly, this fails even in comment '# cat("toto\n")'
|
6
|
+
|
7
|
+
module R2rb
|
8
|
+
|
9
|
+
def R2rb.init(args=["--save","--slave","--quiet"])
|
10
|
+
@@initR=R2rb.initR(args) unless R2rb.alive?
|
11
|
+
end
|
12
|
+
|
13
|
+
def R2rb.alive?
|
14
|
+
defined? @@initR
|
15
|
+
end
|
16
|
+
|
17
|
+
class RBuffer
|
18
|
+
def initialize
|
19
|
+
@s=String.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def init
|
23
|
+
R2rb.init
|
24
|
+
end
|
25
|
+
|
26
|
+
def clear
|
27
|
+
@s=""
|
28
|
+
end
|
29
|
+
|
30
|
+
def +(s=nil)
|
31
|
+
if s
|
32
|
+
s=s.to_s unless s.is_a? String
|
33
|
+
@s += "\n"+s
|
34
|
+
else
|
35
|
+
clear
|
36
|
+
end
|
37
|
+
return self
|
38
|
+
end
|
39
|
+
|
40
|
+
def exec(aff=nil)
|
41
|
+
R2rb.eval @s,aff
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class RConsole
|
46
|
+
def initialize
|
47
|
+
require "readline"
|
48
|
+
end
|
49
|
+
|
50
|
+
def init args
|
51
|
+
R2rb.init args
|
52
|
+
end
|
53
|
+
|
54
|
+
def exec
|
55
|
+
#todo : continuation
|
56
|
+
toggle=true
|
57
|
+
fin=false
|
58
|
+
words=[]
|
59
|
+
rvect=R2rb::RVector.new("")
|
60
|
+
Readline.completion_proc=Proc.new {|e|
|
61
|
+
cpt=0
|
62
|
+
begin
|
63
|
+
begin
|
64
|
+
cpt += 1
|
65
|
+
toggle = !toggle
|
66
|
+
rvect << (toggle ? "apropos(" : "ls(pat=")+"'^"+e+"')" > words
|
67
|
+
res=words.map{|w| w[Regexp.new("^"+e+".*")]}-[nil]
|
68
|
+
end while res.empty? and cpt<3
|
69
|
+
res
|
70
|
+
rescue
|
71
|
+
warn("\r"+e+" not suitable for completion!!!")
|
72
|
+
[]
|
73
|
+
end
|
74
|
+
}
|
75
|
+
Readline.completion_append_character=""
|
76
|
+
begin
|
77
|
+
line = Readline.readline("R> ", true)
|
78
|
+
if !(fin = line=="quit")
|
79
|
+
R2rb.eval line,true
|
80
|
+
toggle=true
|
81
|
+
end
|
82
|
+
end until fin
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def find_installed_R
|
88
|
+
|
89
|
+
if RUBY_PLATFORM=~/mingw/ or RUBY_PLATFORM=~/msys/
|
90
|
+
ENV["R_HOME"]=`R RHOME`
|
91
|
+
elsif RUBY_PLATFORM=~/darwin/
|
92
|
+
ENV["R_HOME"]=`R RHOME`.strip
|
93
|
+
else
|
94
|
+
dirs=["/usr/lib/R","/usr/local/lib/R","/usr/lib64/R"]
|
95
|
+
|
96
|
+
dirs.each do |dir|
|
97
|
+
if FileTest.exists?(dir)
|
98
|
+
return dir
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
raise RuntimeError, "couldn't find R Home : R seems to be uninstalled!!"
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
ENV["R_HOME"]=`R RHOME`.strip.split("\n").select{|l| l=~/^\//}[0] unless `R RHOME`.empty?
|
108
|
+
|
109
|
+
ENV["R_HOME"]=find_installed_R unless ENV["R_HOME"]
|
data/lib/R4rb/R4rb.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
class Object
|
3
|
+
|
4
|
+
def R4rb_is(mode)
|
5
|
+
unless [R2rb,Rserve,"R2rb","Rserve",:R2rb,:Rserve].include? mode
|
6
|
+
puts "Improper value for R4rb_is function!"
|
7
|
+
return
|
8
|
+
end
|
9
|
+
unless mode.is_a? Module
|
10
|
+
mode=mode.to_s.to_sym
|
11
|
+
##puts "R4rb_is: mode=#{mode}"
|
12
|
+
mode= case mode
|
13
|
+
when :R2rb
|
14
|
+
R2rb
|
15
|
+
when :Rserve
|
16
|
+
Rserve
|
17
|
+
end
|
18
|
+
end
|
19
|
+
if mode==Rserve and !Rserve.running?
|
20
|
+
puts "Rserve is not running and R4rb_is method cannot be set to :Rserve!"
|
21
|
+
mode=R2rb
|
22
|
+
end
|
23
|
+
##p mode
|
24
|
+
## trick to avoid warning when modifying constant!
|
25
|
+
con=Object #( self.is_a?(Module) ? self : self.class )
|
26
|
+
con.send(:remove_const, :R4rb) if con.const_defined?(:R4rb)
|
27
|
+
con.const_set(:R4rb, mode)
|
28
|
+
end
|
29
|
+
|
30
|
+
def R2rb_running?
|
31
|
+
Object.const_get(:R4rb)==R2rb
|
32
|
+
end
|
33
|
+
|
34
|
+
def Rserve_running?
|
35
|
+
Object.const_get(:R4rb)==Rserve
|
36
|
+
end
|
37
|
+
|
38
|
+
def R4rb_status?
|
39
|
+
puts "R is now in "+ ( R2rb_running? ? "local" : "server" )+" use!"
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
## first init
|
47
|
+
unless Object.const_defined?(:R4rb)
|
48
|
+
##puts "First, R4rb initialized to R2rb!"
|
49
|
+
R4rb_is R2rb
|
50
|
+
end
|
51
|
+
|
52
|
+
=begin
|
53
|
+
module R4rb
|
54
|
+
|
55
|
+
def R4rb.mode=(mode) #mode=:R4rb or :Rserve
|
56
|
+
return unless [:R2rb,:Rserve].include? mode
|
57
|
+
puts mode
|
58
|
+
puts Rserve
|
59
|
+
$R4rb=(mode==:R2rb ? R2rb : Rserve)
|
60
|
+
puts "R4rb mode changed: #{$R2rb.inspect}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def R4rb.init(args=["--save","--slave","--quiet"])
|
64
|
+
R2rb.init(args)
|
65
|
+
end
|
66
|
+
|
67
|
+
def R4rb.<<(code)
|
68
|
+
$R4rb << code
|
69
|
+
end
|
70
|
+
|
71
|
+
def R4rb.<(code)
|
72
|
+
$R4rb < code
|
73
|
+
end
|
74
|
+
|
75
|
+
def R4rb.output(code)
|
76
|
+
$R4rb.output(code)
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
class << self
|
81
|
+
alias eval <<
|
82
|
+
end
|
83
|
+
|
84
|
+
RVector=$R4rb::RVector
|
85
|
+
|
86
|
+
end
|
87
|
+
=end
|
88
|
+
|
89
|
+
## reload
|
90
|
+
class String
|
91
|
+
|
92
|
+
def R2rb
|
93
|
+
R2rb < self
|
94
|
+
end
|
95
|
+
|
96
|
+
def Rserve(cli=nil)
|
97
|
+
Rserve < self
|
98
|
+
end
|
99
|
+
|
100
|
+
def R4rb
|
101
|
+
R4rb < self
|
102
|
+
end
|
103
|
+
|
104
|
+
alias to_R R4rb
|
105
|
+
alias evalR R4rb
|
106
|
+
alias Reval R4rb
|
107
|
+
alias R R4rb
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class Array
|
112
|
+
|
113
|
+
def R2rb(var)
|
114
|
+
R2rb::RVector.assign(var.to_s,self)
|
115
|
+
end
|
116
|
+
|
117
|
+
def RServe(var,cli=nil)
|
118
|
+
Rserve::RVector.assign(var.to_s,self,cli)
|
119
|
+
end
|
120
|
+
|
121
|
+
def R4rb(var)
|
122
|
+
R4rb::RVector.assign(var.to_s,self)
|
123
|
+
end
|
124
|
+
|
125
|
+
alias to_R R4rb
|
126
|
+
alias evalR R4rb
|
127
|
+
alias Reval R4rb
|
128
|
+
alias R R4rb
|
129
|
+
|
130
|
+
|
131
|
+
#@@rb2R=nil
|
132
|
+
|
133
|
+
## connect Array class to some RVector!!!
|
134
|
+
def Array.initR(init=true)
|
135
|
+
R2rb.init if init
|
136
|
+
#p @@rb2R
|
137
|
+
end
|
138
|
+
|
139
|
+
## Here again to make this package self-content
|
140
|
+
def rb2R=(mode=nil)
|
141
|
+
##puts "rb2R mode #{object_id}";p mode
|
142
|
+
mode=R4rb unless mode
|
143
|
+
return if @rb2R_mode and @rb2R_mode==mode
|
144
|
+
@rb2R_mode=mode unless @rb2R_mode
|
145
|
+
@rb2R=(@rb2R_mode==Rserve ? Rserve::RVector.new("") : R2rb::RVector.new("") )
|
146
|
+
##puts "rb2R=";p @rb2R
|
147
|
+
end
|
148
|
+
|
149
|
+
def >(outR) #outR represents here an R object
|
150
|
+
self.rb2R=nil unless @rb2R
|
151
|
+
@rb2R << outR
|
152
|
+
@rb2R < self
|
153
|
+
return self
|
154
|
+
end
|
155
|
+
|
156
|
+
def <(outR) #outR represents here an R expression to execute and put inside the Array
|
157
|
+
#p @rb2R
|
158
|
+
self.rb2R=nil unless @rb2R
|
159
|
+
@rb2R << outR
|
160
|
+
@rb2R > self
|
161
|
+
return self
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|