galaaz 0.4.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.
Files changed (86) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +32 -0
  3. data/Rakefile +177 -0
  4. data/bin/galaaz +8 -0
  5. data/examples/50Plots_MasterList/scatter_plot.rb +51 -0
  6. data/examples/baseball.csv +1 -0
  7. data/examples/baseball.rb +16 -0
  8. data/examples/ggplot.rb +178 -0
  9. data/examples/islr/Figure.jpg +0 -0
  10. data/examples/islr/all.rb +32 -0
  11. data/examples/islr/ch2.spec.rb +148 -0
  12. data/examples/islr/ch3.spec.rb +28 -0
  13. data/examples/islr/ch3_boston.rb +77 -0
  14. data/examples/islr/ch3_multiple_regression.rb +36 -0
  15. data/examples/islr/ch6.spec.rb +64 -0
  16. data/examples/paper/paper.rb +36 -0
  17. data/examples/sthda_ggplot/README.md +38 -0
  18. data/examples/sthda_ggplot/all.rb +68 -0
  19. data/examples/sthda_ggplot/one_variable_continuous/density_gg.rb +52 -0
  20. data/examples/sthda_ggplot/one_variable_continuous/geom_area.rb +61 -0
  21. data/examples/sthda_ggplot/one_variable_continuous/geom_density.rb +77 -0
  22. data/examples/sthda_ggplot/one_variable_continuous/geom_dotplot.rb +69 -0
  23. data/examples/sthda_ggplot/one_variable_continuous/geom_freqpoly.rb +69 -0
  24. data/examples/sthda_ggplot/one_variable_continuous/geom_histogram.rb +62 -0
  25. data/examples/sthda_ggplot/one_variable_continuous/histogram_density.rb +55 -0
  26. data/examples/sthda_ggplot/one_variable_continuous/stat.rb +62 -0
  27. data/examples/sthda_ggplot/one_variable_discrete/bar.rb +54 -0
  28. data/examples/sthda_ggplot/qplots/box_violin_dot.rb +57 -0
  29. data/examples/sthda_ggplot/qplots/scatter_plots.rb +67 -0
  30. data/examples/sthda_ggplot/scatter_gg.rb +60 -0
  31. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_bin2d.rb +49 -0
  32. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_density2d.rb +64 -0
  33. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_hex.rb +52 -0
  34. data/examples/sthda_ggplot/two_variables_cont_cont/geom_point.rb +65 -0
  35. data/examples/sthda_ggplot/two_variables_cont_cont/geom_smooth.rb +66 -0
  36. data/examples/sthda_ggplot/two_variables_cont_cont/misc.rb +83 -0
  37. data/examples/sthda_ggplot/two_variables_cont_function/geom_area.rb +63 -0
  38. data/examples/sthda_ggplot/two_variables_disc_cont/geom_bar.rb +85 -0
  39. data/examples/sthda_ggplot/two_variables_disc_cont/geom_boxplot.rb +62 -0
  40. data/examples/sthda_ggplot/two_variables_disc_cont/geom_dotplot.rb +75 -0
  41. data/examples/sthda_ggplot/two_variables_disc_cont/geom_jitter.rb +74 -0
  42. data/examples/sthda_ggplot/two_variables_disc_cont/geom_line.rb +55 -0
  43. data/examples/sthda_ggplot/two_variables_disc_cont/geom_violin.rb +70 -0
  44. data/examples/sthda_ggplot/two_variables_disc_disc/geom_jitter.rb +40 -0
  45. data/examples/sthda_ggplot/two_variables_error/geom_crossbar.rb +108 -0
  46. data/examples/subsetting.rb +372 -0
  47. data/lib/expression.rb +45 -0
  48. data/lib/galaaz.rb +27 -0
  49. data/lib/r.rb +118 -0
  50. data/lib/r_methods.rb +89 -0
  51. data/lib/rbinary_operators.rb +226 -0
  52. data/lib/rclosure.rb +34 -0
  53. data/lib/rdata_frame.rb +63 -0
  54. data/lib/renvironment.rb +34 -0
  55. data/lib/rexpression.rb +34 -0
  56. data/lib/rindexed_object.rb +68 -0
  57. data/lib/rlanguage.rb +64 -0
  58. data/lib/rlist.rb +72 -0
  59. data/lib/rmatrix.rb +38 -0
  60. data/lib/rmd_indexed_object.rb +43 -0
  61. data/lib/robject.rb +297 -0
  62. data/lib/rpkg.rb +53 -0
  63. data/lib/rsupport.rb +292 -0
  64. data/lib/rsupport_scope.rb +77 -0
  65. data/lib/rsymbol.rb +57 -0
  66. data/lib/ruby_callback.rb +83 -0
  67. data/lib/ruby_extensions.rb +74 -0
  68. data/lib/runary_operators.rb +58 -0
  69. data/lib/rvector.rb +117 -0
  70. data/r_requires/ggplot.rb +31 -0
  71. data/specs/all.rb +45 -0
  72. data/specs/r_dataframe.spec.rb +181 -0
  73. data/specs/r_eval.spec.rb +164 -0
  74. data/specs/r_function.spec.rb +105 -0
  75. data/specs/r_language.spec.rb +135 -0
  76. data/specs/r_list.spec.rb +129 -0
  77. data/specs/r_list_apply.spec.rb +99 -0
  78. data/specs/r_matrix.spec.rb +83 -0
  79. data/specs/r_vector_creation.spec.rb +99 -0
  80. data/specs/r_vector_functions.spec.rb +59 -0
  81. data/specs/r_vector_object.spec.rb +94 -0
  82. data/specs/r_vector_operators.spec.rb +174 -0
  83. data/specs/r_vector_subsetting.spec.rb +136 -0
  84. data/specs/tmp.rb +134 -0
  85. data/version.rb +2 -0
  86. metadata +198 -0
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ # check if packages are already installed and if not intall them
25
+ R.install_rlibs('ggplot2', 'grid', 'gridExtra', 'ggplotify')
26
+
27
+ # Load plotting libraries
28
+ R.library('ggplot2')
29
+ R.library('grid')
30
+ R.library('gridExtra')
31
+ R.library('ggplotify')
@@ -0,0 +1,45 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2013 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require_relative 'r_eval.spec'
25
+
26
+ # Specification for R::Vector
27
+ require_relative 'r_vector_creation.spec'
28
+ require_relative 'r_vector_object.spec'
29
+ require_relative 'r_vector_subsetting.spec'
30
+ require_relative 'r_vector_functions.spec'
31
+ require_relative 'r_vector_operators.spec'
32
+
33
+ # Specification for R::Lists
34
+ require_relative 'r_list.spec'
35
+ require_relative 'r_list_apply.spec'
36
+
37
+ # Specification for R::Matrix
38
+ require_relative 'r_matrix.spec'
39
+
40
+ # Specification for R::Dataframes
41
+ require_relative 'r_dataframe.spec'
42
+
43
+ # Specification for language features
44
+ require_relative 'r_function.spec'
45
+ require_relative 'r_language.spec'
@@ -0,0 +1,181 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+
26
+ describe R::DataFrame do
27
+
28
+ #----------------------------------------------------------------------------------------
29
+ context "Create DataFrame" do
30
+
31
+ it "should create a dataframe from a vector" do
32
+ vec = R.seq(6)
33
+ vec.dim = R.c(2, 3)
34
+
35
+ # create a DataFrame from a vector
36
+ df = R.as__data__frame(vec)
37
+ expect(df[1, "V1"]).to eq 1
38
+ expect df[1, 'V2'] == 3
39
+ expect df[1, :all] == R.c(V1: 1, V2: 3, V3: 5)
40
+
41
+ end
42
+
43
+ end
44
+
45
+ #----------------------------------------------------------------------------------------
46
+ context "Subsetting" do
47
+
48
+ it "should do integer subsetting" do
49
+ grades = R.c(1.0, 2.0, 2.0, 3.0, 1.0)
50
+
51
+ info = R.data__frame(
52
+ grade: (3..1),
53
+ desc: R.c("Excellent", "Good", "Poor"),
54
+ fail: R.c(false, false, true)
55
+ )
56
+
57
+ id = R.match(grades, info.grade)
58
+ table = info[id, :all]
59
+
60
+ expect(table.grade[1]).to eq 1
61
+ expect(table.desc.levels[2]).to eq "Good"
62
+ expect(table.fail[4]).to eq false
63
+
64
+ info.rownames = info.grade
65
+ table2 = info[grades.as__character, :all]
66
+
67
+ expect(table2.grade[2]).to eq 2
68
+ expect(table2.desc.levels[1]).to eq "Excellent"
69
+ expect(table2.fail[4]).to eq true
70
+
71
+ end
72
+
73
+ it "should do 'each_column'" do
74
+
75
+ mtcars = ~:mtcars
76
+
77
+ mtcars.each_column do |col, col_name|
78
+ # col_name is an R::Vector with one string element.
79
+ # Extract the 'native' value by indexing with '<< 0'
80
+ case col_name << 0
81
+ when "mpg"
82
+ expect col[1] == 21
83
+ expect col[9] == 22.8
84
+ expect col[32] == 21.4
85
+ when "cyl"
86
+ expect col[1] == 6
87
+ expect col[10] == 6
88
+ expect col[32] == 4
89
+ when "disp"
90
+ expect col[1] == 160
91
+ expect col[32] == 121
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+
98
+ it "should do 'each_row'" do
99
+
100
+ mtcars = ~:mtcars
101
+
102
+ mtcars.each_row do |row, row_name|
103
+ case row_name << 0
104
+ when "Mazda RX4"
105
+ expect row['mpg'] == 21
106
+ expect row.qsec == 16.46
107
+ when "Hornet Sportabout"
108
+ expect row['cyl'] == 8
109
+ expect row['wt'] == 3.44
110
+ when "Merc 240D"
111
+ expect row['hp'] == 62
112
+ expect row.drat == 3.69
113
+ when "Volvo 142E"
114
+ expect row.hp == 109
115
+ expect row.am == 1
116
+ expect row.carb == 2
117
+ end
118
+
119
+ end
120
+
121
+ end
122
+
123
+ end
124
+
125
+ #----------------------------------------------------------------------------------------
126
+ context "Boostraping" do
127
+
128
+ before(:each) do
129
+ @df = R.data__frame(x: R.rep((1..3), each: 2), y: (6..1), z: (~:letters)[(1..6)])
130
+ R.set__seed(10)
131
+ end
132
+
133
+ it "should do reordering with integer subsetting" do
134
+
135
+ table = @df[R.sample(@df.nrow), :all]
136
+ expect(table.x[3]).to eq 3
137
+ expect(table.y[2]).to eq 5
138
+ expect(table.z.levels[6]).to eq "f"
139
+
140
+ end
141
+
142
+ it "should select random rows with integer subsetting" do
143
+ table = @df[R.sample(@df.nrow, 3), :all]
144
+
145
+ expect(table.x[3]).to eq 3
146
+ expect(table.y[1]).to eq 3
147
+ expect(table.z.levels[table.z[2]]).to eq "b"
148
+ end
149
+
150
+ it "should randomly reorder a dataframe" do
151
+ df2 = @df[R.sample(@df.nrow), (3..1)]
152
+
153
+ expect(df2.z.levels[df2.z[4]]).to eq "c"
154
+ expect(df2.y[2]).to eq 5
155
+ expect(df2.x[5]).to eq 1
156
+ end
157
+
158
+ it "should reorder by a given variable" do
159
+ df2 = @df[R.sample(@df.nrow), (3..1)]
160
+ df2 = df2[df2.x.order, :all]
161
+
162
+ expect(df2.x[1]).to eq 1
163
+ expect(df2.y[1]).to eq 5
164
+ expect(df2.z.levels[df2.z[1]]).to eq "b"
165
+ end
166
+
167
+ it "should reorder variables" do
168
+ df2 = @df[R.sample(@df.nrow), (3..1)]
169
+ df2 = df2[df2.x.order, :all]
170
+
171
+ df2 = df2[:all, df2.names.order]
172
+
173
+ expect(df2.names.all__equal R.c("x", "y", "z")).to eq true
174
+ end
175
+
176
+ end
177
+
178
+ # df = R.tibble::tibble(x = 1:3, y = 3:1, z = letters[1:3])
179
+
180
+ end
181
+
@@ -0,0 +1,164 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+
26
+ describe R do
27
+
28
+ context "Accessing R through R::Support.eval" do
29
+
30
+ before(:each) do
31
+ R::Support.eval(<<-R)
32
+ # x is a "double" vector
33
+ x <- c(1, 2, 3)
34
+ hyp <- function(x, y) { sqrt(x^2 + y^2) };
35
+ R
36
+ end
37
+
38
+ it "Integer values in R are automatically unboxed as float" do
39
+ var = R::Support.eval("5L")
40
+ # although var is an Interop, it is automatically unboxed, when it is a vector of length
41
+ # one, and can thus be compared with a number.
42
+ expect(5).to eq var
43
+ expect(5.0).to eq var
44
+ end
45
+
46
+ it "Interop pointers can be operated through eval" do
47
+ var = R::Support.eval("5L")
48
+ # calling method 'class' on var returns a vector of size one with a string that
49
+ # contains the class of the object
50
+ expect("integer").to eq R::Support.eval("class").call(var).to_s
51
+ end
52
+
53
+ it "A number evaluated in R is automatically unboxed as float in Ruby" do
54
+ var = R::Support.eval("4")
55
+ expect(4.0).to eq var
56
+ expect("numeric").to eq R::Support.eval("class").call(var).to_s
57
+ end
58
+
59
+ it "R vectors can be indexed by the indexing method of the host language" do
60
+ var = R::Support.eval("'Hello'")
61
+ expect(var[0]).to eq "Hello"
62
+ end
63
+
64
+ it "should retrieve named R objects to Ruby variables using eval. Returned value should be an Interop" do
65
+ # retrieve x and hyp from R and attribute it to local Ruby variables
66
+ x = R::Support.eval("x")
67
+ # hyp is an R function and works like a named function in Ruby
68
+ hyp = R::Support.eval("hyp")
69
+
70
+ # is is a foreign object
71
+ expect(Truffle::Interop.foreign?(x)).to be true
72
+ # we can index the object starting at 0. This is a property offered by
73
+ # Interop API
74
+ expect(x[0]).to eq 1.0
75
+
76
+ # calling a named function or block is done by use of the 'call' method
77
+ expect(hyp.call(3, 4)).to eq 5.0
78
+ end
79
+
80
+ end
81
+
82
+ context "Basic access to R without R::Support" do
83
+
84
+ it "should retrieve named R objects to Ruby variables by using '~' " do
85
+ # retrieve x and hyp from R and attribute it to local Ruby variables
86
+ x = ~:x
87
+
88
+ expect(x.is_a? R::Vector).to eq true
89
+ expect(x.length).to eq 3
90
+ # it is not a foreign object. It's an R::Vectors
91
+ expect(Truffle::Interop.foreign?(x)).to be false
92
+ # Values are indexed starting with 1, the same as R notation
93
+ expect(x[1]).to eq 1.0
94
+ end
95
+
96
+ it "should return a String Vector" do
97
+ # Interop will take a one dimensional array and return the value of the first
98
+ # element. This might change on a future release. At the present moment, var
99
+ # becomes a character array with 5 elements
100
+ var = R.c("Hello")
101
+
102
+ expect(var.length).to eq 1
103
+ expect(var.typeof).to eq "character"
104
+ expect(var.is_a? R::Vector).to eq true
105
+ expect(var[1]).to eq "Hello"
106
+ end
107
+
108
+ it "shoud access named objects in R" do
109
+ # to create a double vector through the Ruby interface, we need that at least
110
+ # one element of the vector is a 'float'
111
+ double = R.c(1.0, 2, 3)
112
+ expect((~:x).identical double).to eq true
113
+ expect(R.hyp(3, 4)).to eq 5
114
+ end
115
+
116
+ it "should box R functions in R::Closure Ruby class" do
117
+ # hyp is an R function and works like a named function in Ruby
118
+ hyp = ~:hyp
119
+
120
+ # calling a named function or block is done by use of the 'call' method
121
+ expect(hyp.call(3, 4)).to eq 5.0
122
+ expect(hyp.typeof).to eq "closure"
123
+ expect(hyp.is_a? R::Closure).to eq true
124
+ end
125
+
126
+ it "should print values the same way as R" do
127
+ # retrieve x and hyp from R and attribute it to local Ruby variables
128
+ x = ~:x
129
+
130
+ # Converting to string (to_s) will print as an R vector would
131
+ expect(x[1].to_s).to eq ("[1] 1")
132
+ expect(x.to_s).to eq ("[1] 1 2 3")
133
+ end
134
+
135
+ it "should allow logical comparison using R::Objects" do
136
+ # retrieve x and hyp from R and attribute it to local Ruby variables
137
+ x = ~:x
138
+
139
+ expect(x[1] == 1).to eq true
140
+ expect(x[2] == 1).to eq false
141
+ end
142
+
143
+ it "should have NA" do
144
+ expect(R.is__na R::NA).to eq true
145
+ end
146
+
147
+ end
148
+
149
+ context "Call Non-standard Evaluation methods" do
150
+
151
+ it "should pass delayed evaluation parameters to methods" do
152
+ # call the subset method filtering by 'cyl == 8 & carb > 3'
153
+ # In order to convert a Ruby symbol to an R symbol we use the '.r' method on the
154
+ # Ruby symbol. Ruby bitwise operators '&' and '|' are overloaded and used as
155
+ # the equivalent R operators and not as bitwise operators.
156
+ mt_subset = (~:mtcars).subset((:cyl == 8) & (:carb > 3))
157
+ expect(mt_subset.mpg == R.c(14.3, 10.4, 10.4, 14.7, 13.3, 15.8, 15.0)).to eq true
158
+ expect((mt_subset.cyl == 8).all).to eq true
159
+ expect((mt_subset.carb > 3).all).to eq true
160
+ end
161
+
162
+ end
163
+
164
+ end
@@ -0,0 +1,105 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+
26
+ describe R do
27
+
28
+ #----------------------------------------------------------------------------------------
29
+ context "When calling R functions" do
30
+
31
+ # Let's call a function passing named parameters
32
+ it "should pass named parameters" do
33
+ # Named parameters are in Ruby are converted to named parameters in R
34
+ m = R.matrix(R.seq(1, 10), nrow: 2,
35
+ dimnames: R.list(R.c("1", "2"),
36
+ R.c("a", "b", "c", "d", "e")))
37
+ expect(m.dimnames[[1]].identical(R.c("1", "2"))).to eq true
38
+ expect(m.dimnames[[2]].identical(R.c("a", "b", "c", "d", "e"))).to eq true
39
+ end
40
+
41
+ end
42
+
43
+ #----------------------------------------------------------------------------------------
44
+ context "Using Ruby Procs as parameters to R functions and expressions" do
45
+
46
+ before(:each) do
47
+ @x = @y = R.seq(-~:pi, ~:pi, length: 10)
48
+ end
49
+
50
+ it "should accept a Proc as parameter" do
51
+ # call R outer function passing in a Proc
52
+ # note that x and y are Ruby objects that were received from an
53
+ # R function, so they are R::Vectors or another type of R::Object. We
54
+ # can operate on them with R functions: for instance, R.cos(y)
55
+ f = R.outer(@x, @y,
56
+ lambda { |x, y|
57
+ R.cos(y) / (x**2 + 1)})
58
+ expect(f[1, 1] == -0.09199967).to eq true
59
+ expect(f[7, 6] == -0.04599983).to eq true
60
+ end
61
+
62
+ it "should accept a Method as parameter" do
63
+
64
+ module Calculation
65
+ # note that x and y are Ruby objects that were received from an
66
+ # R function, so they are R::Vectors or another type of R::Object. We
67
+ # can operate on them with R functions: for instance, R.cos(y)
68
+ def self.func(x, y)
69
+ R.cos(y) / (x**2 + 1)
70
+ end
71
+ end
72
+
73
+ f = R.outer(@x, @y, Calculation.method(:func))
74
+ expect(f[1, 1] == -0.09199967).to eq true
75
+ expect(f[7, 6] == -0.04599983).to eq true
76
+
77
+ end
78
+
79
+ it "should accept Procs in Expressions" do
80
+
81
+ df = R.data__frame(x: @x, y: @y)
82
+ # create a quoted function f that takes 3 parameters :x, :y and a Proc
83
+ # we want to evaluate f in the scope of the dataframe 'df'
84
+ f = E.outer(:x, :y, lambda { |x, y| R.cos(y) / (1 + x**2) })
85
+
86
+ # now lets evaluate f in the scope of df, where :x and :y are defined
87
+ res = f.eval(df)
88
+ expect(res[1, 1] == -0.09199967).to eq true
89
+ expect(res[10, 10] == -0.09199967).to eq true
90
+ end
91
+
92
+ it "Should be able to 'eval' a Proc in expression" do
93
+
94
+ df = R.data__frame(x: R.c(1, 2, 3), y: R.c(4, 5, 6))
95
+ f = E.outer(:x, :y, Proc.new { |x, y| x + y })
96
+
97
+ res = f.eval(df)
98
+ expect(res[1, :all] == R.c(5, 6, 7)).to eq true
99
+ expect(res[3, :all] == R.c(7, 8, 9)).to eq true
100
+
101
+ end
102
+
103
+ end
104
+
105
+ end