r_bridge 0.5.0 → 0.5.1
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 +4 -4
- data/README.md +14 -4
- data/Rakefile +34 -0
- data/example/example.rb +56 -0
- data/example/example_ptr_manager_block.rb +23 -0
- data/example/example_ptr_manager_explicit_use.rb +10 -0
- data/example/example_using_lcons.rb +14 -0
- data/ext/r_bridge/r_lang.c +8 -0
- data/lib/r_bridge/r_bridge_ffi.rb +12 -1
- data/lib/r_bridge/r_bridge_lazyfunc_ext.rb +1 -1
- data/lib/r_bridge/version.rb +1 -1
- data/r_bridge.gemspec +2 -2
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 678aaf66ad022546771461a682f5dee6efa065402c8890197ac3e809cb491cda
|
4
|
+
data.tar.gz: 6e4c24a1f8fc85599707ca0aa7799a8b7ef7bfbb0fcb7e1f1cc720f58f179046
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2eabdfe3403067cd795090593deeb96ba2a7d70ace07e9e7540d598df234134bf5969143fcdc27695a09bf65692c24e6fb78db3f59a91b3ce8d741f43382b5c1
|
7
|
+
data.tar.gz: eb0e3cd227b22842584c686b9c93af7ca36434d2754132f58544fcc72b69b406630639abf2a021f2c2c160ecd3c6451d4c842517b806299198aaa5bf48a73a13
|
data/README.md
CHANGED
@@ -41,12 +41,14 @@ Depending on installing via source or binary, necessary settings differ. If you
|
|
41
41
|
+ This path should have libR.pc file.
|
42
42
|
5. For R to properly work, R_HOME variable is sometimes required. Set it to the root directory that contains R libraries.
|
43
43
|
+ (e.g.) export R_HOME=/usr/lib64/R
|
44
|
-
6. Install 'r_bridge'
|
44
|
+
6. Install 'r_bridge' gem
|
45
45
|
|
46
46
|
```
|
47
47
|
gem install r_bridge
|
48
48
|
```
|
49
49
|
|
50
|
+
|
51
|
+
|
50
52
|
* For Windows
|
51
53
|
|
52
54
|
For windows, there is a known issue. Output from R contains unknown characters, which may relate to UTF16 conversion within Windows.
|
@@ -57,15 +59,13 @@ For windows, there is a known issue. Output from R contains unknown characters,
|
|
57
59
|
2. Make sure that R.exe and R.dll can be seen from your system.
|
58
60
|
+ For Windows, add path for R.exe (e.g. C:\Program Files\R\R-4.0.2\bin ) to 'Path' system or user variable.
|
59
61
|
+ Also, create 'RUBY_DLL_PATH' system or user variable, which includes path for R.dll (e.g. C:\Program Files\R\R-4.0.2\bin\x64 ).
|
60
|
-
3. Install 'r_bridge'
|
62
|
+
3. Install 'r_bridge' gem
|
61
63
|
|
62
64
|
```
|
63
65
|
gem install r_bridge
|
64
66
|
```
|
65
67
|
|
66
68
|
|
67
|
-
|
68
|
-
|
69
69
|
## Example
|
70
70
|
|
71
71
|
* Example 1
|
@@ -203,6 +203,16 @@ ary = [ RBridge::SymbolR.new("y"),
|
|
203
203
|
formula = RBridge::create_formula_from_syms( ary ) # y ~ x
|
204
204
|
```
|
205
205
|
|
206
|
+
* Create EXTPTRSXP type object
|
207
|
+
|
208
|
+
If you need to deal with external pointers in R, you can hold them with EXTPTRSXP type objects.
|
209
|
+
|
210
|
+
create_extptr takes FFI::Pointer as its argument, and creates EXTPTRSXP object. Internally R_MakeExternalPtr() C function is used.
|
211
|
+
|
212
|
+
```
|
213
|
+
RBridge.create_extptr( ffi_ptr )
|
214
|
+
```
|
215
|
+
|
206
216
|
|
207
217
|
* Create R function call
|
208
218
|
|
data/Rakefile
CHANGED
@@ -1,10 +1,44 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/testtask"
|
3
|
+
require 'rake/clean'
|
3
4
|
|
5
|
+
message_for_rake_compiler = "This gem requires native extension compilation. rake-compiler gem should be installed and 'rake compile' before 'rake test'."
|
6
|
+
|
7
|
+
begin
|
8
|
+
require "rake/extensiontask"
|
9
|
+
rescue LoadError => e
|
10
|
+
puts "ERROR:" + message_for_rake_compiler
|
11
|
+
raise
|
12
|
+
end
|
13
|
+
raise ("ERROR:" + message_for_rake_compiler) unless defined? Rake::ExtensionTask
|
14
|
+
|
15
|
+
# rake compile
|
16
|
+
Rake::ExtensionTask.new do |ext|
|
17
|
+
ext.name = "librbridge" # This should be same as shared library name specified in create_makefile of extconf.rb
|
18
|
+
ext.ext_dir = "ext/r_bridge"
|
19
|
+
ext.lib_dir = "lib/r_bridge"
|
20
|
+
end
|
21
|
+
|
22
|
+
# rake test
|
4
23
|
Rake::TestTask.new(:test) do |t|
|
5
24
|
t.libs << "test"
|
6
25
|
t.libs << "lib"
|
7
26
|
t.test_files = FileList["test/**/*_test.rb"]
|
8
27
|
end
|
9
28
|
|
29
|
+
# rake example
|
30
|
+
task :example do
|
31
|
+
file_list = Dir.glob("example/example*.rb")
|
32
|
+
file_list.each(){|path|
|
33
|
+
puts "###### Running script #{path} #####"
|
34
|
+
ruby path
|
35
|
+
puts ""
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# rake clean
|
40
|
+
CLEAN.include(["tmp/", "lib/r_bridge/librbridge.so"])
|
41
|
+
|
42
|
+
|
10
43
|
task :default => :test
|
44
|
+
task :test => :compile
|
data/example/example.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require("r_bridge")
|
2
|
+
|
3
|
+
RBridge.init_embedded_r()
|
4
|
+
|
5
|
+
fun = RBridge.create_function_call("getwd", {} )
|
6
|
+
path = RBridge.exec_function(fun)
|
7
|
+
RBridge.exec_function( RBridge.create_function_call( "print", { "x" => path } ))
|
8
|
+
|
9
|
+
RBridge.exec_function( RBridge.create_function_call( "print", { "x" => RBridge.create_function_call("getwd", {} ) } ))
|
10
|
+
|
11
|
+
RBridge.ptr_manager_open ("mean_function") {
|
12
|
+
i_v = RBridge.create_vec([0,1,2,3,4,5,6,7,8,9,10,50])
|
13
|
+
r_v = RBridge.create_vec( [0.2] )
|
14
|
+
func = RBridge.create_function_call( "mean", {"trim" => r_v , "x" => i_v })
|
15
|
+
result = RBridge.exec_function(func)
|
16
|
+
|
17
|
+
# print RBridge.confirm_type( result, :REALSXP )
|
18
|
+
func2 = RBridge.create_function_call( "print", { "x" => result } )
|
19
|
+
RBridge.exec_function(func2)
|
20
|
+
}
|
21
|
+
|
22
|
+
RBridge.ptr_manager_open("cat hello world"){
|
23
|
+
s_v = RBridge.create_vec( ["Hello", "World", "from", "Ruby+R", "\n"] )
|
24
|
+
func3 = RBridge.create_function_call( "cat", { "" => s_v } )
|
25
|
+
RBridge.exec_function_no_return(func3) # Here exec_function() raises error b/c return value is nil.
|
26
|
+
}
|
27
|
+
|
28
|
+
RBridge.ptr_manager_open("prepare regression analysis"){
|
29
|
+
ary = [ RBridge::SymbolR.new("y"),
|
30
|
+
RBridge::SymbolR.new("~"),
|
31
|
+
RBridge::SymbolR.new("x")]
|
32
|
+
formula = RBridge::create_formula_from_syms( ary )
|
33
|
+
|
34
|
+
df = RBridge::create_dataframe( { "y" => [12, 13, 14, 18 , 17, 20, 20 ] , "x" => [ 1, 2, 3, 4, 5, 6, 7]} )
|
35
|
+
|
36
|
+
# assign to R variable
|
37
|
+
RBridge::exec_function( RBridge::create_assign_function( "formula" , formula ) )
|
38
|
+
RBridge::exec_function( RBridge::create_assign_function( "df" , df ))
|
39
|
+
}
|
40
|
+
|
41
|
+
RBridge.ptr_manager_open("run regression analysis. lm(formula, data) "){
|
42
|
+
# obtain from R variable
|
43
|
+
formula = RBridge::SymbolR.new("formula").to_r_symbol
|
44
|
+
df = RBridge::SymbolR.new("df").to_r_symbol
|
45
|
+
|
46
|
+
func4 = RBridge.create_function_call( "lm", { "formula" => formula , "data" => df } )
|
47
|
+
model = RBridge.exec_function(func4)
|
48
|
+
func5 = RBridge.create_function_call( "summary", { "object" => model })
|
49
|
+
summary = RBridge.exec_function(func5)
|
50
|
+
func6 = RBridge.create_function_call( "print", { "x" => summary })
|
51
|
+
RBridge.exec_function(func6)
|
52
|
+
}
|
53
|
+
|
54
|
+
RBridge.gc_all()
|
55
|
+
RBridge.end_embedded_r()
|
56
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "r_bridge"
|
2
|
+
RBridge.init_embedded_r()
|
3
|
+
|
4
|
+
RBridge.ptr_manager_open("prepare regression analysis"){
|
5
|
+
ary = [ RBridge::SymbolR.new("y"),
|
6
|
+
RBridge::SymbolR.new("~"),
|
7
|
+
RBridge::SymbolR.new("x")]
|
8
|
+
formula = RBridge::create_formula_from_syms( ary )
|
9
|
+
|
10
|
+
df = RBridge::create_dataframe( { "y" => [12, 13, 14, 18 , 17, 20, 20 ] , "x" => [ 1, 2, 3, 4, 5, 6, 7]} )
|
11
|
+
|
12
|
+
RBridge.ptr_manager_open("a little break"){
|
13
|
+
RBridge::exec_function_no_return(RBridge::create_function_call("print", {"x" => RBridge::create_vec( ["(^^)" , "<" , "Hello"] ) }))
|
14
|
+
}
|
15
|
+
|
16
|
+
# assign to R variable
|
17
|
+
reg = RBridge::exec_function( RBridge::create_function_call( "lm" , {"data" => df , "formula" => formula } ) )
|
18
|
+
summary = RBridge::exec_function( RBridge::create_function_call( "summary" , {"object" => reg } ) )
|
19
|
+
RBridge::exec_function_no_return(RBridge::create_function_call( "print" , {"x" => summary }))
|
20
|
+
}
|
21
|
+
|
22
|
+
RBridge.gc_all() # In this case, not necesary. ( When there are objects that are not managed by ptr_manager, this is necessary.)
|
23
|
+
RBridge.end_embedded_r()
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "r_bridge"
|
2
|
+
RBridge.init_embedded_r()
|
3
|
+
|
4
|
+
RBridge.ptr_manager_open("pm1")
|
5
|
+
new_vec = RBridge.create_vec(["Hello", "World"])
|
6
|
+
RBridge.exec_function_no_return( RBridge.create_function_call("print", {"x" => new_vec }))
|
7
|
+
RBridge.ptr_manager_close("pm1")
|
8
|
+
|
9
|
+
RBridge.gc_all() # In this case, not necesary. ( When there are objects that are not managed by ptr_manager, this is necessary.)
|
10
|
+
RBridge.end_embedded_r()
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "r_bridge"
|
2
|
+
|
3
|
+
RBridge.init_embedded_r()
|
4
|
+
|
5
|
+
getwd = RBridge.create_function_call( "print", { "x" => RBridge.create_function_call( "getwd", {} ) } )
|
6
|
+
RBridge.exec_function_no_return(getwd)
|
7
|
+
|
8
|
+
lcons1 = RBridge.lcons_gen( RBridge.create_vec(["Hello", "World"]) )
|
9
|
+
RBridge.set_tag_to_lcons( lcons1, "x")
|
10
|
+
lcons2 = RBridge.lcons(RBridge.r_lang_symbol("print") , lcons1)
|
11
|
+
RBridge.exec_function_no_return(lcons2)
|
12
|
+
|
13
|
+
RBridge.gc_all()
|
14
|
+
RBridge.end_embedded_r()
|
data/ext/r_bridge/r_lang.c
CHANGED
@@ -43,6 +43,14 @@ r_lang_symbol( const char* symbol_name)
|
|
43
43
|
return r_symbol;
|
44
44
|
}
|
45
45
|
|
46
|
+
EXPORT SEXP
|
47
|
+
r_lang_create_extptr( void* ptr )
|
48
|
+
{
|
49
|
+
SEXP extptr;
|
50
|
+
PROTECT( extptr = R_MakeExternalPtr( ptr, R_NilValue, R_NilValue ));
|
51
|
+
return extptr;
|
52
|
+
}
|
53
|
+
|
46
54
|
EXPORT SEXP
|
47
55
|
r_lang_nil()
|
48
56
|
{
|
@@ -30,6 +30,8 @@ module RBridge
|
|
30
30
|
attach_function :r_lang_set_tag, [:pointer, :string], :void
|
31
31
|
attach_function :r_lang_symbol, [:string], :pointer
|
32
32
|
|
33
|
+
attach_function :r_lang_create_extptr, [:pointer], :pointer
|
34
|
+
|
33
35
|
attach_function :r_eval, [:pointer], :pointer
|
34
36
|
attach_function :r_eval_no_return, [:pointer], :pointer
|
35
37
|
|
@@ -185,7 +187,6 @@ module RBridge
|
|
185
187
|
when FalseClass
|
186
188
|
1
|
187
189
|
else
|
188
|
-
nil
|
189
190
|
raise " The current elemnt is not supported to convert to R vector : " + elem
|
190
191
|
end
|
191
192
|
}
|
@@ -208,6 +209,7 @@ module RBridge
|
|
208
209
|
when 1
|
209
210
|
raise "All the elements shold be true/false. Current value: " + ary[idx]
|
210
211
|
end
|
212
|
+
converted
|
211
213
|
else
|
212
214
|
ary[idx]
|
213
215
|
end
|
@@ -283,6 +285,15 @@ module RBridge
|
|
283
285
|
r_lang_set_tag( lcons, tag_name )
|
284
286
|
end
|
285
287
|
|
288
|
+
def self.create_extptr( ffi_pointer )
|
289
|
+
raise "create_extptr should take a FFI::Pointer argument" if(ffi_pointer.class != FFI::Pointer)
|
290
|
+
|
291
|
+
extptr = r_lang_create_extptr(ffi_pointer)
|
292
|
+
|
293
|
+
ptr_manager_add_ptr_to_current( extptr )
|
294
|
+
return extptr
|
295
|
+
end
|
296
|
+
|
286
297
|
def self.create_function_call( fname, hash )
|
287
298
|
raise "create_function_call should take String for function name" if(fname.class != String)
|
288
299
|
raise "create_function_call should take Hash for function arguments" if(hash.class != Hash)
|
@@ -7,7 +7,7 @@ module RBridge
|
|
7
7
|
return LazyFunc.new( fname, hash , param_manager)
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.create_function_call_from_lazy_function
|
10
|
+
def self.create_function_call_from_lazy_function( fname, fargs, param_manager, result_manager)
|
11
11
|
farg_keys = fargs.keys
|
12
12
|
|
13
13
|
new_arg_hash = {}
|
data/lib/r_bridge/version.rb
CHANGED
data/r_bridge.gemspec
CHANGED
@@ -6,8 +6,8 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.authors = ["Toshihiro Umehara"]
|
7
7
|
spec.email = ["toshi@niceume.com"]
|
8
8
|
|
9
|
-
spec.summary = %q{Enables Ruby to
|
10
|
-
spec.description = %q{R (language) provides C interface. This package utilize the interface and allow Ruby to
|
9
|
+
spec.summary = %q{Enables Ruby to construct and evaluate R internal objects}
|
10
|
+
spec.description = %q{R (language) provides C interface. This package utilize the interface and allow Ruby to construct and evaluate R's internal S expressions }
|
11
11
|
spec.homepage = "https://github.com/niceume/r_bridge"
|
12
12
|
spec.license = "GPL-3.0"
|
13
13
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r_bridge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toshihiro Umehara
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 1.13.0
|
33
33
|
description: 'R (language) provides C interface. This package utilize the interface
|
34
|
-
and allow Ruby to
|
34
|
+
and allow Ruby to construct and evaluate R''s internal S expressions '
|
35
35
|
email:
|
36
36
|
- toshi@niceume.com
|
37
37
|
executables: []
|
@@ -47,6 +47,10 @@ files:
|
|
47
47
|
- Rakefile
|
48
48
|
- bin/console
|
49
49
|
- bin/setup
|
50
|
+
- example/example.rb
|
51
|
+
- example/example_ptr_manager_block.rb
|
52
|
+
- example/example_ptr_manager_explicit_use.rb
|
53
|
+
- example/example_using_lcons.rb
|
50
54
|
- ext/r_bridge/extconf.rb
|
51
55
|
- ext/r_bridge/r_bridge.c
|
52
56
|
- ext/r_bridge/r_embed.c
|
@@ -87,5 +91,5 @@ requirements: []
|
|
87
91
|
rubygems_version: 3.1.2
|
88
92
|
signing_key:
|
89
93
|
specification_version: 4
|
90
|
-
summary: Enables Ruby to
|
94
|
+
summary: Enables Ruby to construct and evaluate R internal objects
|
91
95
|
test_files: []
|