robject 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +55 -0
- data/Rakefile +1 -0
- data/bin/robj_console +18 -0
- data/lib/robject/base.rb +52 -0
- data/lib/robject/convert.rb +28 -0
- data/lib/robject/core_ext.rb +16 -0
- data/lib/robject/helper.rb +53 -0
- data/lib/robject/r.rb +50 -0
- data/lib/robject/type/array.rb +7 -0
- data/lib/robject/type/data_frame.rb +7 -0
- data/lib/robject/type/function.rb +7 -0
- data/lib/robject/type/integer.rb +7 -0
- data/lib/robject/type/list.rb +7 -0
- data/lib/robject/type/matrix.rb +9 -0
- data/lib/robject/type/numeric.rb +7 -0
- data/lib/robject/type/string.rb +7 -0
- data/lib/robject/type/vector.rb +10 -0
- data/lib/robject/version.rb +3 -0
- data/lib/robject.rb +20 -0
- data/robject.gemspec +26 -0
- data/spec/base_spec.rb +69 -0
- data/spec/convert_spec.rb +87 -0
- data/spec/matrix_spec.rb +58 -0
- data/spec/robject_spec.rb +43 -0
- data/spec/spec_helper.rb +34 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3a8d4b9c98a92abfdae610517e7d9ebc3bbc3f2a
|
4
|
+
data.tar.gz: c38d7155f4cd47ee00a6253e70b2ee50b4df7388
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 149e35c8a0836faba7799024b188c15f624853b05481c91148280ed5d3c16e1954077ca7a8ebe25de91c77a571c3110b176c9d54a7e746e0587f361dc9cdf056
|
7
|
+
data.tar.gz: bcc08bcad3817594d8bb0194b3d8036de1cd67a2b99c679f590acd783de7bb041a9020f50c69531d53f9e3db4ed8ae1f865e1cd9cdfbc956c4b472ddc48e48a2
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Tatsuya Takamura
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# RObject
|
2
|
+
|
3
|
+
RObject is a wrapper library for RSRuby.
|
4
|
+
|
5
|
+
RSRuby provide to access R functions and variables from Ruby code. And, RObject wrap RSRuby's class to appropriate RObject class.
|
6
|
+
|
7
|
+
## Convert R class to RObject
|
8
|
+
|
9
|
+
* `numeric` => `RObject::Numeric`
|
10
|
+
* `vector` => `RObject::Vector`
|
11
|
+
* `matrix` => `RObject::Matrix`
|
12
|
+
* `list` => `RObject::List`
|
13
|
+
* `array` => `RObject::Array`
|
14
|
+
* `data.frame` => `RObject::DataFrame`
|
15
|
+
* `character` => `RObject::String`
|
16
|
+
* other => `RObject::Base`
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Add this line to your application's Gemfile:
|
21
|
+
|
22
|
+
gem 'robject'
|
23
|
+
|
24
|
+
And then execute:
|
25
|
+
|
26
|
+
$ bundle
|
27
|
+
|
28
|
+
Or install it yourself as:
|
29
|
+
|
30
|
+
$ gem install robject
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
Execute `robj_console` to open R-console
|
35
|
+
|
36
|
+
```sh
|
37
|
+
robj_console
|
38
|
+
|
39
|
+
> m = matrix (1..9).to_a, ncol: 3
|
40
|
+
=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
|
41
|
+
|
42
|
+
> print m * m
|
43
|
+
[,1] [,2] [,3]
|
44
|
+
[1,] 30 66 102
|
45
|
+
[2,] 36 81 126
|
46
|
+
[3,] 42 96 150
|
47
|
+
```
|
48
|
+
|
49
|
+
## Contributing
|
50
|
+
|
51
|
+
1. Fork it
|
52
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
53
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
54
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
55
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/robj_console
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.expand_path('../../lib/robject', __FILE__)
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'pry'
|
6
|
+
rescue LoadError => e
|
7
|
+
require 'irb'
|
8
|
+
end
|
9
|
+
|
10
|
+
if defined? Pry
|
11
|
+
RObject::R.run do
|
12
|
+
Pry.start binding, print: ->(output, value){ output.puts "=> #{value.inspect}" }
|
13
|
+
end
|
14
|
+
else
|
15
|
+
RObject::R.run do
|
16
|
+
IRB.start
|
17
|
+
end
|
18
|
+
end
|
data/lib/robject/base.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module RObject
|
3
|
+
class Base < DelegateClass(RObj)
|
4
|
+
attr_reader :robj
|
5
|
+
|
6
|
+
def self.delegate_to_R from_to
|
7
|
+
from_to.each do |from, to|
|
8
|
+
define_method(from) do |*args|
|
9
|
+
R[to].call @robj, *args
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.match? robj, type
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
delegate_to_R '=~' => '==',
|
19
|
+
'**' => '%*%',
|
20
|
+
'is_data_frame?' => 'is_data_frame',
|
21
|
+
'is_list?' => 'is_list'
|
22
|
+
|
23
|
+
def initialize robj
|
24
|
+
@robj = robj
|
25
|
+
super robj
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_missing name, *args, &block
|
29
|
+
if name =~ /^[\-+*\/!><&|\^]+$/
|
30
|
+
R[name.to_s].call @robj, *args
|
31
|
+
else
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def __getobj__
|
37
|
+
to_ruby
|
38
|
+
end
|
39
|
+
|
40
|
+
def as_r
|
41
|
+
@robj.as_r
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_ruby mode = ::RSRuby::BASIC_CONVERSION
|
45
|
+
@robj.to_ruby mode
|
46
|
+
end
|
47
|
+
|
48
|
+
def is_function?
|
49
|
+
R.rsruby.is_function(@robj).to_ruby
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RObject
|
2
|
+
class Convert
|
3
|
+
class NotSupportTypeError < Exception; end
|
4
|
+
|
5
|
+
def self.call_R_without_convert func, *args
|
6
|
+
original_mode = RSRuby.get_default_mode
|
7
|
+
RSRuby.set_default_mode RSRuby::BASIC_CONVERSION
|
8
|
+
result = R.rsruby[func].call(*args)
|
9
|
+
ensure
|
10
|
+
RSRuby.set_default_mode original_mode
|
11
|
+
result
|
12
|
+
end
|
13
|
+
|
14
|
+
def convert robj
|
15
|
+
type = check_R_type robj
|
16
|
+
[DataFrame, Function, List, Array, Matrix, String, Vector, Integer, Numeric, Base].each do |klass|
|
17
|
+
if klass.match? robj, type
|
18
|
+
break klass.new robj
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def check_R_type robj
|
25
|
+
Convert.call_R_without_convert :class, robj
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Fixnum.class_eval do
|
2
|
+
prepend RObject::Helper::NumericDelegateR
|
3
|
+
end
|
4
|
+
|
5
|
+
Bignum.class_eval do
|
6
|
+
prepend RObject::Helper::NumericDelegateR
|
7
|
+
end
|
8
|
+
|
9
|
+
Float.class_eval do
|
10
|
+
prepend RObject::Helper::NumericDelegateR
|
11
|
+
end
|
12
|
+
|
13
|
+
Array.class_eval do
|
14
|
+
prepend RObject::Helper::NumericDelegateR
|
15
|
+
include RObject::Helper::MatrixMultiply
|
16
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module RObject
|
2
|
+
module Helper
|
3
|
+
module MatrixMultiply
|
4
|
+
def * val
|
5
|
+
if val.respond_to?(:is_robj_matrix_multiply?) && val.is_robj_matrix_multiply?
|
6
|
+
R['%*%'].call self, val
|
7
|
+
else
|
8
|
+
super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def is_robj_matrix_multiply?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module NumericDelegateR
|
18
|
+
def + val
|
19
|
+
is_robj_matrix?(val) ? R[:+].call(self, val) : super
|
20
|
+
end
|
21
|
+
|
22
|
+
def - val
|
23
|
+
is_robj_matrix?(val) ? R[:-].call(self, val) : super
|
24
|
+
end
|
25
|
+
|
26
|
+
def / val
|
27
|
+
is_robj_matrix?(val) ? R[:/].call(self, val) : super
|
28
|
+
end
|
29
|
+
|
30
|
+
def * val
|
31
|
+
if is_robj_matrix?(val)
|
32
|
+
if val.respond_to?(:is_robj_matrix_multiply?) && val.is_robj_matrix_multiply? &&
|
33
|
+
self.respond_to?(:is_robj_matrix_multiply?) && self.is_robj_matrix_multiply?
|
34
|
+
R['%*%'].call(self, val)
|
35
|
+
else
|
36
|
+
R[:*].call(self, val)
|
37
|
+
end
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def ** val
|
44
|
+
is_robj_matrix?(val) ? R[:**].call(self, val) : super
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def is_robj_matrix? val
|
49
|
+
val.is_a?(RObject::Vector) || val.is_a?(RObject::Matrix)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/robject/r.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
module RObject
|
2
|
+
module R
|
3
|
+
class << self
|
4
|
+
def method_missing name, *args, &block
|
5
|
+
if name =~ /^(.*)=$/
|
6
|
+
rsruby[:assign].call $1.to_s, args.first
|
7
|
+
elsif rsruby.respond_to? name
|
8
|
+
rsruby.send name, *args
|
9
|
+
else
|
10
|
+
obj = rsruby[name]
|
11
|
+
if obj.is_function?
|
12
|
+
obj.call *args
|
13
|
+
else
|
14
|
+
obj
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def run &block
|
20
|
+
instance_eval &block
|
21
|
+
end
|
22
|
+
|
23
|
+
def print *args
|
24
|
+
rsruby[:print].call *args
|
25
|
+
end
|
26
|
+
|
27
|
+
def lazy_expression r_exp
|
28
|
+
rsruby.eval_R "quote(#{r_exp})"
|
29
|
+
end
|
30
|
+
alias_method "`", :lazy_expression
|
31
|
+
|
32
|
+
def rsruby
|
33
|
+
@rsruby ||= init_rsruby
|
34
|
+
end
|
35
|
+
|
36
|
+
def init_rsruby
|
37
|
+
RSRuby.set_default_mode RSRuby::PROC_CONVERSION
|
38
|
+
converter = RObject::Convert.new
|
39
|
+
@rsruby = RSRuby.instance
|
40
|
+
@rsruby.proc_table[->(x){ true }] = ->(x) { converter.convert x }
|
41
|
+
@rsruby
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def reset
|
46
|
+
@rsruby = nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/robject.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rsruby'
|
2
|
+
require 'delegate'
|
3
|
+
require File.expand_path('../robject/version', __FILE__)
|
4
|
+
require File.expand_path('../robject/helper', __FILE__)
|
5
|
+
require File.expand_path('../robject/r', __FILE__)
|
6
|
+
require File.expand_path('../robject/base', __FILE__)
|
7
|
+
require File.expand_path('../robject/convert', __FILE__)
|
8
|
+
require File.expand_path('../robject/type/matrix', __FILE__)
|
9
|
+
require File.expand_path('../robject/type/vector', __FILE__)
|
10
|
+
require File.expand_path('../robject/type/numeric', __FILE__)
|
11
|
+
require File.expand_path('../robject/type/integer', __FILE__)
|
12
|
+
require File.expand_path('../robject/type/string', __FILE__)
|
13
|
+
require File.expand_path('../robject/type/list', __FILE__)
|
14
|
+
require File.expand_path('../robject/type/array', __FILE__)
|
15
|
+
require File.expand_path('../robject/type/data_frame', __FILE__)
|
16
|
+
require File.expand_path('../robject/type/function', __FILE__)
|
17
|
+
require File.expand_path('../robject/core_ext', __FILE__)
|
18
|
+
|
19
|
+
module RObject
|
20
|
+
end
|
data/robject.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'robject/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "robject"
|
8
|
+
spec.version = RObject::VERSION
|
9
|
+
spec.authors = ["Tatsuya Takamura"]
|
10
|
+
spec.email = ["tkmr2000@gmail.com"]
|
11
|
+
spec.description = %q{RObject is a wrapper library for RSRuby.}
|
12
|
+
spec.summary = %q{RObject is a wrapper library for RSRuby.}
|
13
|
+
spec.homepage = "https://github.com/ttakamura"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "rsruby", ">= 0.5"
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rspec", "~> 2.13.0"
|
25
|
+
spec.add_development_dependency "rspec-mocks", "~> 2.13.0"
|
26
|
+
end
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RObject::Base do
|
4
|
+
let!(:rsruby) { rsruby_stub }
|
5
|
+
|
6
|
+
def robject original_value
|
7
|
+
rsruby_obj = double("rsruby::robj (#{original_value})")
|
8
|
+
rsruby_obj.stub(:to_ruby).and_return original_value
|
9
|
+
RObject::Base.new rsruby_obj
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'robject([1, 2, 3])' do
|
13
|
+
subject { robject([1,2,3]) }
|
14
|
+
|
15
|
+
it { should be_include 3 }
|
16
|
+
it { should == [1,2,3] }
|
17
|
+
|
18
|
+
its(:to_ruby) { should == [1,2,3] }
|
19
|
+
its(:inspect) { should == '[1, 2, 3]' }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'auto conversion' do
|
23
|
+
describe 'R-object receive a method' do
|
24
|
+
subject { robject([5,6]) }
|
25
|
+
it { should == [5,6] }
|
26
|
+
it { should be_include 5 }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'Ruby-object receive a method with R-object' do
|
30
|
+
subject { [5,6].include? robject(5) }
|
31
|
+
it { should be_true }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#method_missing' do
|
36
|
+
shared_examples_for 'call a R-function' do |name, right_val, response|
|
37
|
+
before do
|
38
|
+
func = double("R-function")
|
39
|
+
func.should_receive(:call).with(obj.robj, right_val).and_return response
|
40
|
+
rsruby.should_receive(:[]).with(name).and_return func
|
41
|
+
end
|
42
|
+
it { should == response }
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'robject([1,2,3])' do
|
46
|
+
let(:obj) { robject([1,2,3]) }
|
47
|
+
|
48
|
+
describe '+ 100' do
|
49
|
+
subject { obj + 100 }
|
50
|
+
it_behaves_like 'call a R-function', '+', 100, [101, 102, 103]
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '- 100' do
|
54
|
+
subject { obj - 100 }
|
55
|
+
it_behaves_like 'call a R-function', '-', 100, [-99, -98, -97]
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '* 100' do
|
59
|
+
subject { obj * 100 }
|
60
|
+
it_behaves_like 'call a R-function', '*', 100, [100, 200, 300]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'call a Ruby-method' do
|
65
|
+
subject { robject(999) }
|
66
|
+
its(:to_s) { should == '999' }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RObject::Convert do
|
4
|
+
let!(:rsruby) { rsruby_stub }
|
5
|
+
let(:converter) { RObject::Convert.new }
|
6
|
+
|
7
|
+
def robj original_value
|
8
|
+
rsruby_obj = double("rsruby::robj (#{original_value})")
|
9
|
+
rsruby_obj.stub(:to_ruby).and_return original_value
|
10
|
+
rsruby_obj
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#convert' do
|
14
|
+
let(:length_val) { 0 }
|
15
|
+
|
16
|
+
shared_examples_for 'convert RObj to' do |klass|
|
17
|
+
before do
|
18
|
+
rsruby.stub(:[]).with(:length).and_return double(call: length_val)
|
19
|
+
rsruby.stub(:[]).with(:class).and_return double(call: r_class)
|
20
|
+
end
|
21
|
+
subject { converter.convert robj(value) }
|
22
|
+
it { should be_a klass }
|
23
|
+
it { should == value }
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'DataFrame' do
|
27
|
+
let(:value) { { x: [1,2,3] } }
|
28
|
+
let(:r_class) { 'data.frame' }
|
29
|
+
it_behaves_like 'convert RObj to', RObject::DataFrame
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'Function' do
|
33
|
+
let(:value) { 'R-function' }
|
34
|
+
let(:r_class) { 'function' }
|
35
|
+
it_behaves_like 'convert RObj to', RObject::Function
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'List' do
|
39
|
+
let(:value) { [1, 2, 3] }
|
40
|
+
let(:r_class) { 'list' }
|
41
|
+
it_behaves_like 'convert RObj to', RObject::List
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'Array' do
|
45
|
+
let(:value) { [1, 2, 3] }
|
46
|
+
let(:r_class) { 'array' }
|
47
|
+
it_behaves_like 'convert RObj to', RObject::Array
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'Matrix' do
|
51
|
+
let(:value) { [[1, 2], [3, 4]] }
|
52
|
+
let(:r_class) { 'matrix' }
|
53
|
+
it_behaves_like 'convert RObj to', RObject::Matrix
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'Vector' do
|
57
|
+
let(:length_val) { 2 }
|
58
|
+
let(:value) { [1, 2, 3] }
|
59
|
+
let(:r_class) { 'numeric' }
|
60
|
+
it_behaves_like 'convert RObj to', RObject::Vector
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'String' do
|
64
|
+
let(:value) { "hello world" }
|
65
|
+
let(:r_class) { 'character' }
|
66
|
+
it_behaves_like 'convert RObj to', RObject::String
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'Numeric' do
|
70
|
+
let(:value) { 99.0 }
|
71
|
+
let(:r_class) { 'numeric' }
|
72
|
+
it_behaves_like 'convert RObj to', RObject::Numeric
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'Integer' do
|
76
|
+
let(:value) { 31 }
|
77
|
+
let(:r_class) { 'integer' }
|
78
|
+
it_behaves_like 'convert RObj to', RObject::Integer
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'Base' do
|
82
|
+
let(:value) { 100 }
|
83
|
+
let(:r_class) { 'unknown' }
|
84
|
+
it_behaves_like 'convert RObj to', RObject::Base
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/spec/matrix_spec.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RObject::Matrix do
|
4
|
+
def robj original_value
|
5
|
+
rsruby_obj = double("rsruby::robj (#{original_value})")
|
6
|
+
rsruby_obj.stub(:to_ruby).and_return original_value
|
7
|
+
rsruby_obj
|
8
|
+
end
|
9
|
+
|
10
|
+
let!(:rsruby) { rsruby_stub }
|
11
|
+
let(:matrix) { RObject::Matrix.new robj([[1, 2], [3, 4]]) }
|
12
|
+
let(:vector) { RObject::Vector.new robj([10, 100]) }
|
13
|
+
|
14
|
+
describe 'multiplication' do
|
15
|
+
let(:result) { [[7, 10], [15, 22]] }
|
16
|
+
|
17
|
+
context 'robj * robj-matrix' do
|
18
|
+
before { rsruby_func_stub rsruby, '%*%', [matrix, matrix], result }
|
19
|
+
subject { matrix * matrix }
|
20
|
+
it { should == result }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'robj * robj-vector' do
|
24
|
+
let(:result) { [310, 420] }
|
25
|
+
before { rsruby_func_stub rsruby, '%*%', [matrix, vector], result }
|
26
|
+
subject { matrix * vector }
|
27
|
+
it { should == result }
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'robj * ruby-array' do
|
31
|
+
let(:result) { [120, 340] }
|
32
|
+
before { rsruby_func_stub rsruby, '%*%', [matrix, [100, 10]], result }
|
33
|
+
subject { matrix * [100, 10] }
|
34
|
+
it { should == result }
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'ruby-array * robj' do
|
38
|
+
let(:result) { [120, 340] }
|
39
|
+
before { rsruby_func_stub rsruby, '%*%', [[100, 10], matrix], result }
|
40
|
+
subject { [100, 10] * matrix }
|
41
|
+
it { should == result }
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'robj * ruby-number' do
|
45
|
+
let(:result) { [[10, 20], [30, 40]] }
|
46
|
+
before { rsruby_func_stub rsruby, '*', [matrix.robj, 10], result }
|
47
|
+
subject { matrix * 10 }
|
48
|
+
it { should == result }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'ruby-number * robj' do
|
52
|
+
let(:result) { [[10, 20], [30, 40]] }
|
53
|
+
before { rsruby_func_stub rsruby, :*, [10, matrix], result }
|
54
|
+
subject { 10 * matrix }
|
55
|
+
it { should == result }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RObject::R do
|
4
|
+
let!(:rsruby) { rsruby_stub }
|
5
|
+
|
6
|
+
describe '#lazy_expression' do
|
7
|
+
before do
|
8
|
+
rsruby.should_receive(:eval_R).with('quote(a + b)') { RObject::Base.new nil }
|
9
|
+
end
|
10
|
+
|
11
|
+
subject { @expression = RObject::R.lazy_expression('a + b') }
|
12
|
+
it { should be_a RObject::Base }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#method_missing' do
|
16
|
+
context 'call a RSRuby method' do
|
17
|
+
before { rsruby.should_receive(:eval_R).with('11 + 44').and_return 55 }
|
18
|
+
subject { RObject::R.eval_R '11 + 44' }
|
19
|
+
it { should == 55 }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'call a R-function' do
|
23
|
+
before { rsruby_func_stub rsruby, :sum, [11, 22], 33 }
|
24
|
+
subject { RObject::R.sum 11, 22 }
|
25
|
+
it { should == 33 }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'assign a value to R-variable' do
|
29
|
+
before do
|
30
|
+
rsruby_variable_stub rsruby, :x, 100
|
31
|
+
RObject::R.x = 100
|
32
|
+
end
|
33
|
+
subject { RObject::R.x }
|
34
|
+
it { should == 100 }
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'get a R-variable' do
|
38
|
+
before { rsruby_variable_stub rsruby, :y, 900 }
|
39
|
+
subject { RObject::R.y }
|
40
|
+
it { should == 900 }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path('../../lib/robject', __FILE__)
|
2
|
+
|
3
|
+
module RObject::SpecDSL
|
4
|
+
def rsruby_stub
|
5
|
+
rsruby = double("rsruby")
|
6
|
+
RObject::R.stub(:rsruby).and_return(rsruby)
|
7
|
+
proc_table = {}
|
8
|
+
rsruby.stub(:default_mode=).with(4)
|
9
|
+
rsruby.stub(:proc_table) { proc_table }
|
10
|
+
rsruby
|
11
|
+
end
|
12
|
+
|
13
|
+
def rsruby_func_stub rsruby, name, args, response
|
14
|
+
func = double(name.to_s)
|
15
|
+
func.stub(:call).with(*args).and_return response
|
16
|
+
func.stub(:is_function?).and_return true
|
17
|
+
rsruby.stub(:[]).with(name).and_return func
|
18
|
+
func
|
19
|
+
end
|
20
|
+
|
21
|
+
def rsruby_variable_stub rsruby, name, value
|
22
|
+
variable = RObject::Base.new double(name.to_s)
|
23
|
+
variable.stub(:to_ruby).and_return value
|
24
|
+
variable.stub(:is_function?).and_return false
|
25
|
+
rsruby_func_stub rsruby, :assign, [name.to_s, value], variable
|
26
|
+
rsruby.stub(:[]).with(name).and_return variable
|
27
|
+
variable
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
RSpec.configure do |config|
|
32
|
+
config.mock_framework = :rspec
|
33
|
+
config.include RObject::SpecDSL
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: robject
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tatsuya Takamura
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-05-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rsruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.5'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.13.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.13.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-mocks
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.13.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.13.0
|
83
|
+
description: RObject is a wrapper library for RSRuby.
|
84
|
+
email:
|
85
|
+
- tkmr2000@gmail.com
|
86
|
+
executables:
|
87
|
+
- robj_console
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- .gitignore
|
92
|
+
- Gemfile
|
93
|
+
- LICENSE.txt
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- bin/robj_console
|
97
|
+
- lib/robject.rb
|
98
|
+
- lib/robject/base.rb
|
99
|
+
- lib/robject/convert.rb
|
100
|
+
- lib/robject/core_ext.rb
|
101
|
+
- lib/robject/helper.rb
|
102
|
+
- lib/robject/r.rb
|
103
|
+
- lib/robject/type/array.rb
|
104
|
+
- lib/robject/type/data_frame.rb
|
105
|
+
- lib/robject/type/function.rb
|
106
|
+
- lib/robject/type/integer.rb
|
107
|
+
- lib/robject/type/list.rb
|
108
|
+
- lib/robject/type/matrix.rb
|
109
|
+
- lib/robject/type/numeric.rb
|
110
|
+
- lib/robject/type/string.rb
|
111
|
+
- lib/robject/type/vector.rb
|
112
|
+
- lib/robject/version.rb
|
113
|
+
- robject.gemspec
|
114
|
+
- spec/base_spec.rb
|
115
|
+
- spec/convert_spec.rb
|
116
|
+
- spec/matrix_spec.rb
|
117
|
+
- spec/robject_spec.rb
|
118
|
+
- spec/spec_helper.rb
|
119
|
+
homepage: https://github.com/ttakamura
|
120
|
+
licenses:
|
121
|
+
- MIT
|
122
|
+
metadata: {}
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubyforge_project:
|
139
|
+
rubygems_version: 2.0.3
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
142
|
+
summary: RObject is a wrapper library for RSRuby.
|
143
|
+
test_files:
|
144
|
+
- spec/base_spec.rb
|
145
|
+
- spec/convert_spec.rb
|
146
|
+
- spec/matrix_spec.rb
|
147
|
+
- spec/robject_spec.rb
|
148
|
+
- spec/spec_helper.rb
|
149
|
+
has_rdoc:
|