alexgutteridge-rsruby 0.5
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 +11 -0
- data/License.txt +504 -0
- data/Manifest.txt +39 -0
- data/README.txt +96 -0
- data/Rakefile.rb +153 -0
- data/examples/arrayfields.rb +52 -0
- data/examples/bioc.rb +35 -0
- data/examples/dataframe.rb +35 -0
- data/examples/erobj.rb +30 -0
- data/ext/Converters.c +667 -0
- data/ext/Converters.h +77 -0
- data/ext/R_eval.c +144 -0
- data/ext/R_eval.h +40 -0
- data/ext/extconf.rb +13 -0
- data/ext/robj.c +205 -0
- data/ext/rsruby.c +182 -0
- data/ext/rsruby.h +87 -0
- data/lib/rsruby.rb +302 -0
- data/lib/rsruby/dataframe.rb +107 -0
- data/lib/rsruby/erobj.rb +105 -0
- data/lib/rsruby/robj.rb +67 -0
- data/test/table.txt +4 -0
- data/test/tc_array.rb +59 -0
- data/test/tc_boolean.rb +30 -0
- data/test/tc_cleanup.rb +22 -0
- data/test/tc_eval.rb +21 -0
- data/test/tc_extensions.rb +43 -0
- data/test/tc_init.rb +11 -0
- data/test/tc_io.rb +57 -0
- data/test/tc_library.rb +20 -0
- data/test/tc_matrix.rb +23 -0
- data/test/tc_modes.rb +264 -0
- data/test/tc_robj.rb +84 -0
- data/test/tc_sigint.rb +10 -0
- data/test/tc_to_r.rb +145 -0
- data/test/tc_to_ruby.rb +153 -0
- data/test/tc_util.rb +19 -0
- data/test/tc_vars.rb +28 -0
- data/test/test_all.rb +22 -0
- metadata +103 -0
data/ext/rsruby.c
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
/*
|
2
|
+
* == Author
|
3
|
+
* Alex Gutteridge
|
4
|
+
*
|
5
|
+
* == Copyright
|
6
|
+
*Copyright (C) 2006 Alex Gutteridge
|
7
|
+
*
|
8
|
+
* The Original Code is the RPy python module.
|
9
|
+
*
|
10
|
+
* The Initial Developer of the Original Code is Walter Moreira.
|
11
|
+
* Portions created by the Initial Developer are Copyright (C) 2002
|
12
|
+
* the Initial Developer. All Rights Reserved.
|
13
|
+
*
|
14
|
+
* Contributor(s):
|
15
|
+
* Gregory R. Warnes <greg@warnes.net> (RPy Maintainer)
|
16
|
+
*
|
17
|
+
*This library is free software; you can redistribute it and/or
|
18
|
+
*modify it under the terms of the GNU Lesser General Public
|
19
|
+
*License as published by the Free Software Foundation; either
|
20
|
+
*version 2.1 of the License, or (at your option) any later version.
|
21
|
+
*
|
22
|
+
*This library is distributed in the hope that it will be useful,
|
23
|
+
*but WITHOUT ANY WARRANTY; without even the implied warranty of
|
24
|
+
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
25
|
+
*Lesser General Public License for more details.
|
26
|
+
*
|
27
|
+
*You should have received a copy of the GNU Lesser General Public
|
28
|
+
*License along with this library; if not, write to the Free Software
|
29
|
+
*Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
30
|
+
*/
|
31
|
+
|
32
|
+
#include "rsruby.h"
|
33
|
+
|
34
|
+
/* Global list to protect R objects from garbage collection */
|
35
|
+
/* This is inspired in $R_SRC/src/main/memory.c */
|
36
|
+
//static SEXP R_References;
|
37
|
+
|
38
|
+
SEXP
|
39
|
+
RecursiveRelease(SEXP obj, SEXP list)
|
40
|
+
{
|
41
|
+
if (!isNull(list)) {
|
42
|
+
if (obj == CAR(list))
|
43
|
+
return CDR(list);
|
44
|
+
else
|
45
|
+
SETCDR(list, RecursiveRelease(obj, CDR(list)));
|
46
|
+
}
|
47
|
+
return list;
|
48
|
+
}
|
49
|
+
|
50
|
+
/* TODO: This needs implementing as a Ruby destructor for each RObj */
|
51
|
+
/*static void
|
52
|
+
Robj_dealloc(VALUE self)
|
53
|
+
{
|
54
|
+
SEXP robj;
|
55
|
+
|
56
|
+
Data_Get_Struct(self, struct SEXPREC, robj);
|
57
|
+
|
58
|
+
R_References = RecursiveRelease(robj, R_References);
|
59
|
+
SET_SYMVALUE(install("R.References"), R_References);
|
60
|
+
|
61
|
+
return;
|
62
|
+
}*/
|
63
|
+
|
64
|
+
|
65
|
+
/* Obtain an R object via its name.
|
66
|
+
* This is only used to get the 'get' function.
|
67
|
+
* All subsequent calls go via the 'get' function itself
|
68
|
+
*/
|
69
|
+
VALUE get_fun(VALUE self, VALUE name){
|
70
|
+
|
71
|
+
VALUE str;
|
72
|
+
int conversion=TOP_MODE;
|
73
|
+
SEXP robj;
|
74
|
+
VALUE rubyobj;
|
75
|
+
char* cstr_name;
|
76
|
+
|
77
|
+
str = StringValue(name);
|
78
|
+
|
79
|
+
cstr_name = RSTRING(str)->ptr;
|
80
|
+
|
81
|
+
robj = (SEXP)get_fun_from_name(cstr_name);
|
82
|
+
if (!robj)
|
83
|
+
return Qnil;
|
84
|
+
|
85
|
+
/* Wrap the returned R object as a ruby Object */
|
86
|
+
rubyobj = Data_Wrap_Struct(rb_const_get(rb_cObject,
|
87
|
+
rb_intern("RObj")), 0, 0, robj);
|
88
|
+
rb_iv_set(rubyobj,"@conversion",INT2FIX(conversion));
|
89
|
+
rb_iv_set(rubyobj,"@wrap",Qfalse);
|
90
|
+
|
91
|
+
return rubyobj;
|
92
|
+
|
93
|
+
}
|
94
|
+
|
95
|
+
//TODO - This function does not appear to be working correctly
|
96
|
+
void r_finalize(void)
|
97
|
+
{
|
98
|
+
unsigned char buf[1024];
|
99
|
+
char * tmpdir;
|
100
|
+
|
101
|
+
R_dot_Last();
|
102
|
+
R_RunExitFinalizers();
|
103
|
+
CleanEd();
|
104
|
+
KillAllDevices();
|
105
|
+
|
106
|
+
if((tmpdir = getenv("R_SESSION_TMPDIR"))) {
|
107
|
+
snprintf((char *)buf, 1024, "rm -rf %s", tmpdir);
|
108
|
+
R_system((char *)buf);
|
109
|
+
}
|
110
|
+
|
111
|
+
PrintWarnings(); /* from device close and .Last */
|
112
|
+
R_gc(); /* Remove any remaining R objects from memory */
|
113
|
+
}
|
114
|
+
|
115
|
+
/*
|
116
|
+
* Shutdown the R interpreter
|
117
|
+
*/
|
118
|
+
VALUE rs_shutdown(VALUE self){
|
119
|
+
|
120
|
+
r_finalize();
|
121
|
+
Rf_endEmbeddedR(0);
|
122
|
+
return Qtrue;
|
123
|
+
|
124
|
+
}
|
125
|
+
|
126
|
+
/*
|
127
|
+
* Starts the R interpreter.
|
128
|
+
*/
|
129
|
+
VALUE rr_init(VALUE self){
|
130
|
+
|
131
|
+
SEXP R_References;
|
132
|
+
|
133
|
+
init_R(0,NULL);
|
134
|
+
// Initialize the list of protected objects
|
135
|
+
R_References = R_NilValue;
|
136
|
+
SET_SYMVALUE(install("R.References"), R_References);
|
137
|
+
|
138
|
+
return self;
|
139
|
+
|
140
|
+
}
|
141
|
+
|
142
|
+
/*
|
143
|
+
* Initialises the R interpreter.
|
144
|
+
*/
|
145
|
+
void init_R(int argc, char **argv){
|
146
|
+
|
147
|
+
char *defaultArgv[] = {"rsruby","-q","--vanilla"};
|
148
|
+
|
149
|
+
Rf_initEmbeddedR(sizeof(defaultArgv) / sizeof(defaultArgv[0]), defaultArgv);
|
150
|
+
R_Interactive = FALSE; //Remove crash menu (and other interactive R features)
|
151
|
+
}
|
152
|
+
|
153
|
+
/* This method is for testing catching of segfaults */
|
154
|
+
VALUE crash(){
|
155
|
+
int* ptr = (int*)0;
|
156
|
+
*ptr = 1;
|
157
|
+
return Qtrue;
|
158
|
+
}
|
159
|
+
|
160
|
+
|
161
|
+
/* Ruby code */
|
162
|
+
|
163
|
+
VALUE cRRuby;
|
164
|
+
VALUE cRObj;
|
165
|
+
|
166
|
+
void Init_rsruby_c(){
|
167
|
+
|
168
|
+
cRRuby = rb_define_class("RSRuby",rb_cObject);
|
169
|
+
|
170
|
+
rb_define_method(cRRuby, "r_init", rr_init, 0);
|
171
|
+
rb_define_method(cRRuby, "get_fun", get_fun, 1);
|
172
|
+
rb_define_method(cRRuby, "shutdown", rs_shutdown, 0);
|
173
|
+
|
174
|
+
rb_define_method(cRRuby, "crash", crash, 0);
|
175
|
+
|
176
|
+
//Add the lcall method to RObj
|
177
|
+
cRObj = rb_const_get(rb_cObject,rb_intern("RObj"));
|
178
|
+
rb_define_method(cRObj, "lcall", RObj_lcall, 1);
|
179
|
+
rb_define_method(cRObj, "__init_lcall__", RObj_init_lcall, 1);
|
180
|
+
rb_define_method(cRObj, "to_ruby", RObj_to_ruby, -2);
|
181
|
+
|
182
|
+
}
|
data/ext/rsruby.h
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
/*
|
2
|
+
* == Author
|
3
|
+
* Alex Gutteridge
|
4
|
+
*
|
5
|
+
* == Copyright
|
6
|
+
*Copyright (C) 2006 Alex Gutteridge
|
7
|
+
*
|
8
|
+
* The Original Code is the RPy python module.
|
9
|
+
*
|
10
|
+
* The Initial Developer of the Original Code is Walter Moreira.
|
11
|
+
* Portions created by the Initial Developer are Copyright (C) 2002
|
12
|
+
* the Initial Developer. All Rights Reserved.
|
13
|
+
*
|
14
|
+
* Contributor(s):
|
15
|
+
* Gregory R. Warnes <greg@warnes.net> (RPy Maintainer)
|
16
|
+
*
|
17
|
+
*This library is free software; you can redistribute it and/or
|
18
|
+
*modify it under the terms of the GNU Lesser General Public
|
19
|
+
*License as published by the Free Software Foundation; either
|
20
|
+
*version 2.1 of the License, or (at your option) any later version.
|
21
|
+
*
|
22
|
+
*This library is distributed in the hope that it will be useful,
|
23
|
+
*but WITHOUT ANY WARRANTY; without even the implied warranty of
|
24
|
+
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
25
|
+
*Lesser General Public License for more details.
|
26
|
+
*
|
27
|
+
*You should have received a copy of the GNU Lesser General Public
|
28
|
+
*License along with this library; if not, write to the Free Software
|
29
|
+
*Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
30
|
+
*/
|
31
|
+
|
32
|
+
#ifndef R_RUBY_MAIN
|
33
|
+
#define R_RUBY_MAIN
|
34
|
+
|
35
|
+
#include "ruby.h"
|
36
|
+
|
37
|
+
#include "R.h"
|
38
|
+
#include "Rdefines.h"
|
39
|
+
#include "Rinternals.h"
|
40
|
+
#include "Rdefines.h"
|
41
|
+
#include "Rdevices.h"
|
42
|
+
|
43
|
+
#include "signal.h"
|
44
|
+
|
45
|
+
#include "R_eval.h"
|
46
|
+
#include "Converters.h"
|
47
|
+
|
48
|
+
#define MAXIDSIZE 256
|
49
|
+
|
50
|
+
#define NO_CONVERSION 0
|
51
|
+
#define VECTOR_CONVERSION 1
|
52
|
+
#define BASIC_CONVERSION 2
|
53
|
+
#define CLASS_CONVERSION 3
|
54
|
+
#define PROC_CONVERSION 4
|
55
|
+
|
56
|
+
#define TOP_MODE 4
|
57
|
+
|
58
|
+
#define RSRUBY rb_funcall(rb_const_get(rb_cObject,rb_intern("RSRuby")),rb_intern("instance"),0)
|
59
|
+
|
60
|
+
/* Missing definitions from Rinterface.h or RStartup.h */
|
61
|
+
# define CleanEd Rf_CleanEd
|
62
|
+
extern int Rf_initEmbeddedR(int argc, char **argv);
|
63
|
+
extern int R_Interactive;
|
64
|
+
extern void CleanEd(void);
|
65
|
+
extern int R_CollectWarnings;
|
66
|
+
# define PrintWarnings Rf_PrintWarnings
|
67
|
+
extern void PrintWarnings(void);
|
68
|
+
|
69
|
+
void Init_rsruby();
|
70
|
+
|
71
|
+
void init_R(int argc, char *argv[0]);
|
72
|
+
void r_finalize(void);
|
73
|
+
|
74
|
+
SEXP RecursiveRelease(SEXP obj, SEXP list);
|
75
|
+
//static void Robj_dealloc(VALUE self);
|
76
|
+
|
77
|
+
VALUE rs_shutdown(VALUE self);
|
78
|
+
VALUE get_fun(VALUE self, VALUE name);
|
79
|
+
VALUE rr_init(VALUE self);
|
80
|
+
|
81
|
+
VALUE crash(void);
|
82
|
+
|
83
|
+
VALUE RObj_lcall(VALUE self, VALUE args);
|
84
|
+
VALUE RObj_init_lcall(VALUE self, VALUE args);
|
85
|
+
VALUE RObj_to_ruby(VALUE self, VALUE args);
|
86
|
+
int make_argl(VALUE args, SEXP *e);
|
87
|
+
#endif
|
data/lib/rsruby.rb
ADDED
@@ -0,0 +1,302 @@
|
|
1
|
+
require 'rsruby/robj'
|
2
|
+
require 'rsruby_c'
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
require 'complex'
|
6
|
+
|
7
|
+
#== Synopsis
|
8
|
+
#
|
9
|
+
#This class represents the embedded R interpreter. The Singleton module is
|
10
|
+
#mixed in to ensure that only one R interpreter is running in a script at
|
11
|
+
#any one time and that the interpreter can always be easily accessed without
|
12
|
+
#using a global variable.
|
13
|
+
#
|
14
|
+
#The R interpreter is started by calling RSRuby.instance. The returned
|
15
|
+
#object represents the R interpreter and R functions are called by
|
16
|
+
#calling methods on this object:
|
17
|
+
#
|
18
|
+
# r = RSRuby.instance
|
19
|
+
# r.sum(1,2,3)
|
20
|
+
# puts r.t_test(1,2,3)['p-value']
|
21
|
+
#
|
22
|
+
#See the manual[http://web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/manual.pdf] for
|
23
|
+
#more details on calling functions and the conversion system for passing data
|
24
|
+
#between Ruby and R. If no suitable conversion from R to Ruby is found, an RObj
|
25
|
+
#is returned (all R functions are returned as instances of RObj).
|
26
|
+
#--
|
27
|
+
#== Copyright
|
28
|
+
#Copyright (C) 2006 Alex Gutteridge
|
29
|
+
#
|
30
|
+
#The Original Code is the RPy python module.
|
31
|
+
#
|
32
|
+
#The Initial Developer of the Original Code is Walter Moreira.
|
33
|
+
#Portions created by the Initial Developer are Copyright (C) 2002
|
34
|
+
#the Initial Developer. All Rights Reserved.
|
35
|
+
#
|
36
|
+
#Contributor(s):
|
37
|
+
#Gregory R. Warnes <greg@warnes.net> (RPy Maintainer)
|
38
|
+
#
|
39
|
+
#This library is free software; you can redistribute it and/or
|
40
|
+
#modify it under the terms of the GNU Lesser General Public
|
41
|
+
#License as published by the Free Software Foundation; either
|
42
|
+
#version 2.1 of the License, or (at your option) any later version.
|
43
|
+
#
|
44
|
+
#This library is distributed in the hope that it will be useful,
|
45
|
+
#but WITHOUT ANY WARRANTY; without even the implied warranty of
|
46
|
+
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
47
|
+
#Lesser General Public License for more details.
|
48
|
+
#
|
49
|
+
#You should have received a copy of the GNU Lesser General Public
|
50
|
+
#License along with this library; if not, write to the Free Software
|
51
|
+
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
52
|
+
#++
|
53
|
+
|
54
|
+
class RSRuby
|
55
|
+
|
56
|
+
VERSION = '0.5'
|
57
|
+
|
58
|
+
include Singleton
|
59
|
+
|
60
|
+
#Constants for conversion modes
|
61
|
+
TOP_CONVERSION = 4
|
62
|
+
PROC_CONVERSION = 4
|
63
|
+
CLASS_CONVERSION = 3
|
64
|
+
BASIC_CONVERSION = 2
|
65
|
+
VECTOR_CONVERSION = 1
|
66
|
+
NO_CONVERSION = 0
|
67
|
+
NO_DEFAULT = -1
|
68
|
+
|
69
|
+
attr_accessor :proc_table, :class_table, :default_mode, :caching
|
70
|
+
|
71
|
+
#Create a new RSRuby interpreter instance. The Singleton design pattern
|
72
|
+
#ensures that only one instance can be running in a script. Further
|
73
|
+
#calls to RSRuby.instance will return the original instance.
|
74
|
+
def initialize()
|
75
|
+
|
76
|
+
#Initialize R
|
77
|
+
r_init
|
78
|
+
|
79
|
+
@default_mode = NO_DEFAULT
|
80
|
+
|
81
|
+
@class_table = {}
|
82
|
+
@proc_table = {}
|
83
|
+
|
84
|
+
@caching = true
|
85
|
+
reset_cache
|
86
|
+
|
87
|
+
#Catch errors
|
88
|
+
self.__init_eval_R__("options(error=expression(NULL))")
|
89
|
+
#disable errors
|
90
|
+
self.__init_eval_R__("options(show.error.messages=F)")
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
def reset_cache
|
95
|
+
#Setup R object cache
|
96
|
+
@cache = {}
|
97
|
+
@cache['get'] = self.get_fun('get')
|
98
|
+
|
99
|
+
#Get constants
|
100
|
+
@cache['TRUE'] = self.__getitem__('T',true)
|
101
|
+
@cache['FALSE'] = self.__getitem__('F',true)
|
102
|
+
|
103
|
+
@cache['parse'] = self.__getitem__('parse',true)
|
104
|
+
@cache['eval'] = self.__getitem__('eval',true)
|
105
|
+
|
106
|
+
@cache['NA'] = self.__init_eval_R__('NA')
|
107
|
+
@cache['NaN'] = self.__init_eval_R__('NaN')
|
108
|
+
# @cache['NAN'] = self.eval_R('as.double(NA)')
|
109
|
+
|
110
|
+
#help!
|
111
|
+
@cache['helpfun'] = self.with_mode(NO_CONVERSION, self.__getitem__('help',true))
|
112
|
+
end
|
113
|
+
|
114
|
+
#Delete an R object from the cache. Use R-style function naming, not ruby style.
|
115
|
+
def delete_from_cache(x)
|
116
|
+
@cache.delete(x)
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.img(filename,args={})
|
120
|
+
format = File.extname(filename).gsub(".","").to_sym
|
121
|
+
r = RSRuby.instance
|
122
|
+
raise ArgumentError, "Format #{format.to_s} is not supported" unless [:pdf].include? format
|
123
|
+
r.pdf(filename,args)
|
124
|
+
yield(r)
|
125
|
+
r.dev_off.call
|
126
|
+
end
|
127
|
+
|
128
|
+
#Handles method name conversion and calling of R functions
|
129
|
+
#If called without args the R function/varialbe is returned rather
|
130
|
+
#than called.
|
131
|
+
def method_missing(r_id,*args)
|
132
|
+
|
133
|
+
#Translate Ruby method call to R
|
134
|
+
robj_name = RSRuby.convert_method_name(r_id.to_s)
|
135
|
+
|
136
|
+
#Retrieve it
|
137
|
+
robj = self.__getitem__(robj_name)
|
138
|
+
|
139
|
+
#TODO perhaps this is not neccessary - always call these methods
|
140
|
+
#use the [] syntax for variables etc...
|
141
|
+
if args.length > 0
|
142
|
+
|
143
|
+
#convert arguments to lcall format
|
144
|
+
lcall_args = RSRuby.convert_args_to_lcall(args)
|
145
|
+
|
146
|
+
#Return result of calling object with lcall
|
147
|
+
#formatted args
|
148
|
+
return robj.lcall(lcall_args)
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
return robj
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
#The same as method_missing, but only returns the R function/object,
|
157
|
+
#does not call it.
|
158
|
+
def [](r_id)
|
159
|
+
|
160
|
+
#Translate Ruby method call to R
|
161
|
+
robj_name = RSRuby.convert_method_name(r_id.to_s)
|
162
|
+
|
163
|
+
#Retrieve it
|
164
|
+
robj = self.__getitem__(robj_name)
|
165
|
+
|
166
|
+
#And return it
|
167
|
+
return robj
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
#Takes an #RObj representing an R function and sets the 'wrapping'
|
172
|
+
#mode for that function. Implemented for compatibility with RPy.
|
173
|
+
def with_mode(mode,func)
|
174
|
+
func.wrap = mode
|
175
|
+
return func
|
176
|
+
end
|
177
|
+
|
178
|
+
#Converts a String representing a 'Ruby-style' R function name into a
|
179
|
+
#String with the real R name according to the rules given in the manual.
|
180
|
+
def RSRuby.convert_method_name(name)
|
181
|
+
if name.length > 1 and name[-1].chr == '_' and name[-2].chr != '_'
|
182
|
+
name = name[0..-2]
|
183
|
+
end
|
184
|
+
name.gsub!(/__/,'<-')
|
185
|
+
name.gsub!(/_/, '.')
|
186
|
+
return name
|
187
|
+
end
|
188
|
+
|
189
|
+
#Converts an Array of function arguments into lcall format. If the last
|
190
|
+
#element of the array is a Hash then the contents of the Hash are
|
191
|
+
#interpreted as named arguments.
|
192
|
+
#
|
193
|
+
#The returned value is an Array of tuples (Arrays of length two). Each
|
194
|
+
#tupple corresponds to a name/argument pair.
|
195
|
+
#
|
196
|
+
#For example:
|
197
|
+
# convert_args_to_lcall([1,2,3,{:a=>4,:b=>5})
|
198
|
+
# => [['',1],['',2],['',3],['a',4],['b',5]]
|
199
|
+
def RSRuby.convert_args_to_lcall(args)
|
200
|
+
|
201
|
+
lcall_args = []
|
202
|
+
|
203
|
+
args.each_with_index do |arg,i|
|
204
|
+
unless arg.kind_of?(Hash) and i == args.length-1
|
205
|
+
lcall_args.push(['',arg])
|
206
|
+
else
|
207
|
+
arg.each do |k,v|
|
208
|
+
lcall_args.push([k.to_s,v])
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
return lcall_args
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
#Sets the default conversion mode for RSRuby. The constants defined
|
218
|
+
#in #RSRuby should be used
|
219
|
+
#DEPRECATED: Use the accessor instead
|
220
|
+
def RSRuby.set_default_mode(m)
|
221
|
+
if m < -1 or m > TOP_CONVERSION
|
222
|
+
raise ArgumentError, "Invalid mode requested"
|
223
|
+
end
|
224
|
+
RSRuby.instance.default_mode = m
|
225
|
+
end
|
226
|
+
#Returns the current default conversion mode as an Integer.
|
227
|
+
#DEPRECATED: Use the accessor on the RSRuby instance isntead
|
228
|
+
def RSRuby.get_default_mode
|
229
|
+
RSRuby.instance.default_mode
|
230
|
+
end
|
231
|
+
|
232
|
+
#TODO - not implemented
|
233
|
+
def RSRuby.set_rsruby_input(m)
|
234
|
+
@@rsruby_input = m
|
235
|
+
end
|
236
|
+
|
237
|
+
#TODO - not implemented
|
238
|
+
def RSRuby.get_rsruby_input
|
239
|
+
@@rsruby_input
|
240
|
+
end
|
241
|
+
|
242
|
+
#TODO - not implemented
|
243
|
+
def RSRuby.set_rsruby_output(m)
|
244
|
+
@@rsruby_output = m
|
245
|
+
end
|
246
|
+
|
247
|
+
#TODO - not implemented
|
248
|
+
def RSRuby.get_rsruby_output
|
249
|
+
@@rsruby_output
|
250
|
+
end
|
251
|
+
|
252
|
+
#TODO - not implemented
|
253
|
+
def RSRuby.set_rsruby_showfiles(m)
|
254
|
+
@@rsruby_showfiles = m
|
255
|
+
end
|
256
|
+
|
257
|
+
#TODO - not implemented
|
258
|
+
def RSRuby.get_rsruby_showfiles
|
259
|
+
@@rsruby_showfiles
|
260
|
+
end
|
261
|
+
|
262
|
+
#Evaluates the given string in R. Returns the result of the evaluation.
|
263
|
+
def eval_R(s)
|
264
|
+
self.eval(self.parse(:text => s))
|
265
|
+
end
|
266
|
+
|
267
|
+
|
268
|
+
#Wraps the R help function.
|
269
|
+
def help(*args)
|
270
|
+
helpobj = @cache['helpfun'].call(args)
|
271
|
+
self.print(helpobj)
|
272
|
+
end
|
273
|
+
|
274
|
+
|
275
|
+
def __init_eval_R__(s)
|
276
|
+
parsed = self.parse.__init_lcall__([['text',s]])
|
277
|
+
self.eval.__init_lcall__([['',parsed]])
|
278
|
+
end
|
279
|
+
|
280
|
+
def __getitem__(name,init=false)
|
281
|
+
|
282
|
+
#Find the identifier and cache (unless already cached)
|
283
|
+
unless @cache.has_key?(name) && @caching
|
284
|
+
if init
|
285
|
+
robj = @cache['get'].__init_lcall__([['',name]])
|
286
|
+
else
|
287
|
+
robj = @cache['get'].lcall([['',name]])
|
288
|
+
end
|
289
|
+
@cache[name] = robj if @caching
|
290
|
+
end
|
291
|
+
|
292
|
+
#Retrieve object from cache
|
293
|
+
robj ||= @cache[name]
|
294
|
+
|
295
|
+
return robj
|
296
|
+
|
297
|
+
end
|
298
|
+
|
299
|
+
end
|
300
|
+
|
301
|
+
class RException < RuntimeError
|
302
|
+
end
|