r_type 0.0.3
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/.gitignore +17 -0
- data/.travis.yml +14 -0
- data/Gemfile +3 -0
- data/Guardfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +131 -0
- data/Rakefile +9 -0
- data/bin/r_console +17 -0
- data/lib/r_type.rb +41 -0
- data/lib/r_type/convert.rb +28 -0
- data/lib/r_type/core_ext.rb +30 -0
- data/lib/r_type/core_ext/boolean_delegate_r.rb +8 -0
- data/lib/r_type/core_ext/delegate_checker.rb +11 -0
- data/lib/r_type/core_ext/numeric_delegate_r.rb +20 -0
- data/lib/r_type/helper.rb +4 -0
- data/lib/r_type/helper/matrix_multiply.rb +13 -0
- data/lib/r_type/helper/robj_delegatable.rb +78 -0
- data/lib/r_type/helper/robj_delegatable_class_methods.rb +35 -0
- data/lib/r_type/helper/ruby_compareable.rb +9 -0
- data/lib/r_type/r.rb +50 -0
- data/lib/r_type/type/array.rb +7 -0
- data/lib/r_type/type/base.rb +14 -0
- data/lib/r_type/type/data_frame.rb +7 -0
- data/lib/r_type/type/function.rb +8 -0
- data/lib/r_type/type/integer.rb +7 -0
- data/lib/r_type/type/list.rb +7 -0
- data/lib/r_type/type/matrix.rb +65 -0
- data/lib/r_type/type/numeric.rb +7 -0
- data/lib/r_type/type/string.rb +7 -0
- data/lib/r_type/type/vector.rb +10 -0
- data/lib/r_type/version.rb +3 -0
- data/r_type.gemspec +28 -0
- data/sample/sample1.rb +34 -0
- data/sample/sample2.rb +38 -0
- data/sample/sample3.rb +79 -0
- data/sample/sample4.rb +43 -0
- data/sample/sample5.rb +61 -0
- data/spec/convert_spec.rb +93 -0
- data/spec/core_ext/boolean_delegate_r_spec.rb +39 -0
- data/spec/core_ext/numeric_delegate_r_spec.rb +27 -0
- data/spec/helper/robj_delegatable_spec.rb +68 -0
- data/spec/r_spec.rb +54 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/type/base_spec.rb +52 -0
- data/spec/type/matrix_spec.rb +157 -0
- metadata +196 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8b9fb16ae61ba00a4a815f6989ad52d54c53575b
|
4
|
+
data.tar.gz: 08b5f71abdb66b91646f7e7e45ba17bcd0dd6f24
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5c53f982491c53dc282091dd5164c1130ddd7e712b9acf6ed27f0a97319086e7f3fe6dd4212c2b80859283d30353b2fe237e70e6a3ac1aae0a40a692041d35f1
|
7
|
+
data.tar.gz: fc1a2cf86d1dae52c686c2870c6510f96a4e02b6580ae591308e1c2ea06527218e116e5ddac1929f73895f66d722666c17c22febd5c1e5a189053a6efccc3f0e
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
env:
|
2
|
+
- R_HOME=/usr/lib/R
|
3
|
+
rvm:
|
4
|
+
- 2.0.0
|
5
|
+
gemfile:
|
6
|
+
- Gemfile
|
7
|
+
branches:
|
8
|
+
only:
|
9
|
+
- master
|
10
|
+
before_install:
|
11
|
+
- sudo apt-add-repository -y ppa:marutter/rdev
|
12
|
+
- sudo apt-get update -qq
|
13
|
+
- sudo apt-get install -qq r-base-dev
|
14
|
+
- bundle config build.rsruby --with-R-include=/usr/share/R/include
|
data/Gemfile
ADDED
data/Guardfile
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,131 @@
|
|
1
|
+
# RType [](https://travis-ci.org/ttakamura/robject) [](https://gemnasium.com/ttakamura/r_type)
|
2
|
+
|
3
|
+

|
4
|
+
|
5
|
+
RType extend RSRuby to be rubyist can use R in a more Ruby way.
|
6
|
+
|
7
|
+
RSRuby provide to access R functions and variables from Ruby and basic class conversion.
|
8
|
+
And RType provide extended class conversion that convert R class to appropriate Ruby class that has many convenient methods.
|
9
|
+
|
10
|
+
## Convert R class to RType
|
11
|
+
|
12
|
+
* `matrix` => `RType::Matrix`
|
13
|
+
* `numeric` => `RType::Numeric`
|
14
|
+
* `vector` => `RType::Vector`
|
15
|
+
* `list` => `RType::List`
|
16
|
+
* `array` => `RType::Array`
|
17
|
+
* `data.frame` => `RType::DataFrame`
|
18
|
+
* `character` => `RType::String`
|
19
|
+
* other => `RType::Base`
|
20
|
+
|
21
|
+
## Installation
|
22
|
+
|
23
|
+
Add this line to your application's Gemfile:
|
24
|
+
|
25
|
+
gem 'r_type'
|
26
|
+
|
27
|
+
And then execute:
|
28
|
+
|
29
|
+
$ bundle
|
30
|
+
|
31
|
+
Or install it yourself as:
|
32
|
+
|
33
|
+
$ gem install r_type
|
34
|
+
|
35
|
+
## Usage
|
36
|
+
|
37
|
+
### Interactive Console
|
38
|
+
|
39
|
+
Execute `r_console` to open interactive RType console.
|
40
|
+
|
41
|
+
```sh
|
42
|
+
r_console
|
43
|
+
|
44
|
+
> m = matrix (1..9).to_a, ncol: 3
|
45
|
+
=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
|
46
|
+
|
47
|
+
> print m * m
|
48
|
+
[,1] [,2] [,3]
|
49
|
+
[1,] 30 66 102
|
50
|
+
[2,] 36 81 126
|
51
|
+
[3,] 42 96 150
|
52
|
+
```
|
53
|
+
|
54
|
+
### Use RType in your Ruby Class
|
55
|
+
|
56
|
+
* Simple script
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
a = RType::Matrix.new [1,2,3, 4,5,6], ncol: 2
|
60
|
+
b = RType::Matrix.new [10, 100], ncol: 1
|
61
|
+
|
62
|
+
RType::R.print a * b
|
63
|
+
|
64
|
+
# [,1]
|
65
|
+
# [1,] 410
|
66
|
+
# [2,] 520
|
67
|
+
# [3,] 630
|
68
|
+
```
|
69
|
+
|
70
|
+
When you haven't define `::R` constant in your code, RType define `::R` as alias of `RType::R`. So, you can write following code.
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
a = R::Matrix.new [1,2,3, 4,5,6], ncol: 2
|
74
|
+
b = R::Matrix.new [10, 100], ncol: 1
|
75
|
+
|
76
|
+
R.print a * b
|
77
|
+
```
|
78
|
+
|
79
|
+
|
80
|
+
* In `RType::R` context
|
81
|
+
|
82
|
+
`R.run` call given block in `RType::R` context.
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
R.run do
|
86
|
+
a = matrix [1,2,3, 4,5,6], ncol: 2
|
87
|
+
b = matrix [10, 100], ncol: 1
|
88
|
+
print a * b
|
89
|
+
end
|
90
|
+
|
91
|
+
# [,1]
|
92
|
+
# [1,] 410
|
93
|
+
# [2,] 520
|
94
|
+
# [3,] 630
|
95
|
+
```
|
96
|
+
|
97
|
+
|
98
|
+
* Assign a variable from Ruby and use it in R
|
99
|
+
|
100
|
+
Call `RType::R.eval_R` with a string that has R code.
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# assign a value from Ruby
|
104
|
+
R.hoge = [1,2,3,4,5]
|
105
|
+
|
106
|
+
# eval R code
|
107
|
+
R.eval_R <<RTEXT
|
108
|
+
f = function(x) x * 100
|
109
|
+
result = sapply(hoge, f)
|
110
|
+
print(result)
|
111
|
+
RTEXT
|
112
|
+
```
|
113
|
+
|
114
|
+
Or, you can use inline eval_R when `RType::R` context.
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
R.run do
|
118
|
+
hoge = [1,2,3,4,5]
|
119
|
+
result = sapply hoge, `function(x) x * 100`
|
120
|
+
print result
|
121
|
+
end
|
122
|
+
```
|
123
|
+
|
124
|
+
|
125
|
+
## Contributing
|
126
|
+
|
127
|
+
1. Fork it
|
128
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
129
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
130
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
131
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bin/r_console
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.expand_path('../../lib/r_type', __FILE__)
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'pry'
|
6
|
+
rescue LoadError => e
|
7
|
+
puts "Can't find the Pry gem!"
|
8
|
+
puts "Please execute 'gem install pry' to use r_console"
|
9
|
+
exit 1
|
10
|
+
end
|
11
|
+
|
12
|
+
RType::R.run do
|
13
|
+
Pry.start binding, print: ->(output, value) do
|
14
|
+
value.to_ruby if value.respond_to?(:to_ruby)
|
15
|
+
output.puts "=> #{value.inspect}"
|
16
|
+
end
|
17
|
+
end
|
data/lib/r_type.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rsruby'
|
2
|
+
require 'delegate'
|
3
|
+
require 'matrix'
|
4
|
+
require File.expand_path('../r_type/version', __FILE__)
|
5
|
+
require File.expand_path('../r_type/helper', __FILE__)
|
6
|
+
require File.expand_path('../r_type/helper/ruby_compareable', __FILE__)
|
7
|
+
require File.expand_path('../r_type/helper/matrix_multiply', __FILE__)
|
8
|
+
require File.expand_path('../r_type/helper/robj_delegatable_class_methods', __FILE__)
|
9
|
+
require File.expand_path('../r_type/core_ext/delegate_checker', __FILE__)
|
10
|
+
require File.expand_path('../r_type/core_ext/numeric_delegate_r', __FILE__)
|
11
|
+
require File.expand_path('../r_type/core_ext/boolean_delegate_r', __FILE__)
|
12
|
+
require File.expand_path('../r_type/helper/robj_delegatable', __FILE__)
|
13
|
+
require File.expand_path('../r_type/r', __FILE__)
|
14
|
+
require File.expand_path('../r_type/type/base', __FILE__)
|
15
|
+
require File.expand_path('../r_type/convert', __FILE__)
|
16
|
+
require File.expand_path('../r_type/type/matrix', __FILE__)
|
17
|
+
require File.expand_path('../r_type/type/vector', __FILE__)
|
18
|
+
require File.expand_path('../r_type/type/numeric', __FILE__)
|
19
|
+
require File.expand_path('../r_type/type/integer', __FILE__)
|
20
|
+
require File.expand_path('../r_type/type/string', __FILE__)
|
21
|
+
require File.expand_path('../r_type/type/list', __FILE__)
|
22
|
+
require File.expand_path('../r_type/type/array', __FILE__)
|
23
|
+
require File.expand_path('../r_type/type/data_frame', __FILE__)
|
24
|
+
require File.expand_path('../r_type/type/function', __FILE__)
|
25
|
+
require File.expand_path('../r_type/core_ext', __FILE__)
|
26
|
+
|
27
|
+
module RType
|
28
|
+
end
|
29
|
+
|
30
|
+
unless defined?(::R)
|
31
|
+
::R = RType::R
|
32
|
+
::R::Array = RType::Array
|
33
|
+
::R::List = RType::List
|
34
|
+
::R::Integer = RType::Integer
|
35
|
+
::R::Function = RType::Function
|
36
|
+
::R::DataFrame = RType::DataFrame
|
37
|
+
::R::Matrix = RType::Matrix
|
38
|
+
::R::Numeric = RType::Numeric
|
39
|
+
::R::String = RType::String
|
40
|
+
::R::Vector = RType::Vector
|
41
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RType
|
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
|
+
[Function, DataFrame, 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,30 @@
|
|
1
|
+
Fixnum.class_eval do
|
2
|
+
prepend RType::CoreExt::NumericDelegateR
|
3
|
+
prepend RType::CoreExt::BooleanDelegateR
|
4
|
+
prepend RType::CoreExt::DelegateChecker
|
5
|
+
end
|
6
|
+
|
7
|
+
Bignum.class_eval do
|
8
|
+
prepend RType::CoreExt::NumericDelegateR
|
9
|
+
prepend RType::CoreExt::BooleanDelegateR
|
10
|
+
prepend RType::CoreExt::DelegateChecker
|
11
|
+
end
|
12
|
+
|
13
|
+
Float.class_eval do
|
14
|
+
prepend RType::CoreExt::NumericDelegateR
|
15
|
+
prepend RType::CoreExt::BooleanDelegateR
|
16
|
+
prepend RType::CoreExt::DelegateChecker
|
17
|
+
end
|
18
|
+
|
19
|
+
Array.class_eval do
|
20
|
+
prepend RType::CoreExt::NumericDelegateR
|
21
|
+
prepend RType::CoreExt::BooleanDelegateR
|
22
|
+
prepend RType::CoreExt::DelegateChecker
|
23
|
+
include RType::Helper::MatrixMultiply
|
24
|
+
end
|
25
|
+
|
26
|
+
::Matrix.class_eval do
|
27
|
+
def as_r
|
28
|
+
::RType::R.rbind(*self.to_a)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RType::CoreExt
|
2
|
+
module NumericDelegateR
|
3
|
+
extend RType::Helper::RObjDelegatable::ClassMethods
|
4
|
+
|
5
|
+
delegate_to_R '+', '-', '/', '**', '^'
|
6
|
+
|
7
|
+
def * val
|
8
|
+
if is_robj_matrix?(val)
|
9
|
+
if val.respond_to?(:is_robj_matrix_multiply?) && val.is_robj_matrix_multiply? &&
|
10
|
+
self.respond_to?(:is_robj_matrix_multiply?) && self.is_robj_matrix_multiply?
|
11
|
+
R['%*%'].call(self, val)
|
12
|
+
else
|
13
|
+
R[:*].call(self, val)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module RType
|
2
|
+
module Helper
|
3
|
+
module RObjDelegatable
|
4
|
+
extend ClassMethods
|
5
|
+
include RType::CoreExt::NumericDelegateR
|
6
|
+
include RType::CoreExt::BooleanDelegateR
|
7
|
+
|
8
|
+
delegate_to_R '*'
|
9
|
+
|
10
|
+
def self.included(klass)
|
11
|
+
klass.extend ClassMethods
|
12
|
+
end
|
13
|
+
|
14
|
+
def __getobj__
|
15
|
+
to_ruby
|
16
|
+
end
|
17
|
+
|
18
|
+
def robj
|
19
|
+
@robj ||= convert_ruby_to_robj.tap do |newobj|
|
20
|
+
@ruby_obj = nil unless newobj.nil?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def ruby_obj
|
25
|
+
@ruby_obj ||= convert_robj_to_ruby.tap do |newobj|
|
26
|
+
@robj = nil unless newobj.nil?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def robj= obj
|
31
|
+
@ruby_obj = nil
|
32
|
+
@robj = obj
|
33
|
+
end
|
34
|
+
|
35
|
+
def ruby_obj= obj
|
36
|
+
@robj = nil
|
37
|
+
@ruby_obj = obj
|
38
|
+
end
|
39
|
+
|
40
|
+
def as_r
|
41
|
+
robj.as_r
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_ruby mode = nil
|
45
|
+
ruby_obj
|
46
|
+
end
|
47
|
+
|
48
|
+
def inspect
|
49
|
+
"RType::#{(@robj || @ruby_obj).inspect}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def == obj
|
53
|
+
if obj.is_a?(RObjDelegatable)
|
54
|
+
self.robj == obj.robj || !!R['identical'].call(self, obj)
|
55
|
+
else
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def convert_robj_to_ruby
|
62
|
+
@robj.to_ruby(::RSRuby::BASIC_CONVERSION)
|
63
|
+
end
|
64
|
+
|
65
|
+
def convert_ruby_to_robj
|
66
|
+
if @ruby_obj.respond_to?(:as_r)
|
67
|
+
@ruby_obj.as_r.robj
|
68
|
+
else
|
69
|
+
R.assign('_tmp_var_for_rtype', @ruby_obj).robj
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def can_delegate_to_R? *args
|
74
|
+
true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|