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,135 @@
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::Language do
27
+
28
+ #========================================================================================
29
+ context "Working with symbols" do
30
+
31
+ it "should convert a Ruby Symbol to an R Symbol with '+'" do
32
+ a = +:cyl
33
+ expect(a.is_a? R::RSymbol).to eq true
34
+ expect a.to_s == "cyl"
35
+ end
36
+
37
+ it "should assign to an R symbol and retrieve from it" do
38
+ R.cyl = 10
39
+ expect ~:cyl == 10
40
+ end
41
+
42
+ it "should allow calling evaluate on the symbol" do
43
+ R.cyl = 10
44
+ expect R.eval(~:cyl) == 10
45
+ end
46
+
47
+ end
48
+
49
+ #========================================================================================
50
+ context "When creating Calls" do
51
+
52
+ it "binary operators should apply to symbols" do
53
+ # this behaviour is a bit different from R's. In R this would raise an error
54
+ # with cyl not found
55
+ expect (:cyl + 5).to_s == '.Primitive("+")(cyl, 5L)'
56
+ end
57
+
58
+ it "should properly coerce to language" do
59
+ expect (5 + 5).to_s == '.Primitive("+")(5L, cyl)'
60
+ end
61
+
62
+ # Formula objects are special and are very similar to quoted expressions, but
63
+ # they are not really quoted since trying to call R.typeof(<formula>) will
64
+ # evaluate the formula. We add methods .typeof and .rclass in the Ruby class
65
+ it "formula have typeof and rclass" do
66
+ call = :cyl + 5
67
+ expect call.typeof == "language"
68
+ expect call.rclass == "call"
69
+ end
70
+
71
+ it "during calls creation, only symbols are unevaluated" do
72
+ # 5 * 10 evaluate to 50 in the call
73
+ expect(:cyl + 5 * 10).to_s == '.Primitive("+")(cyl, 50L)'
74
+ # define a variable x
75
+ x = 20
76
+ # x is not quoted in the expression
77
+ expect(:cyl + 5 * x).to_s == '.Primitive("+")(cyl, 100L)'
78
+ end
79
+
80
+ end
81
+
82
+ #========================================================================================
83
+
84
+ context "Executing R expressions" do
85
+
86
+ it "should eval an R expression in the context of a list" do
87
+ ct = R.list(a: 10, b: 20, c: 30)
88
+ exp = :a + :b * :c
89
+ expect R.eval(exp, ct) == 610
90
+ end
91
+
92
+ it "should eval an R function in the context of a list" do
93
+ R.x = 5
94
+ expect R.eval(:x + 10) == 15
95
+ ct = R.list(x: 20)
96
+ expect R.eval(:x + 10, ct) == 30
97
+ end
98
+
99
+ end
100
+
101
+
102
+ #========================================================================================
103
+ context "When working with Formulas" do
104
+
105
+ it "should create a RSymbol from a Ruby Symbol using +" do
106
+ sym = +:sym
107
+ expect sym.to_s == "sym"
108
+ end
109
+
110
+ =begin
111
+
112
+ it "should create a formula without the lhs" do
113
+ pending "formulas need to be reimplemented"
114
+ formula = ~(:cyl + :exp)
115
+ expect formula.to_s == '~.Primitive("+")(cyl, exp)'
116
+ expect formula.typeof == 'language'
117
+ expect formula.rclass == 'formula'
118
+ end
119
+
120
+ it "should create formulas with the '=~' operator" do
121
+ formula = (:cyl =~ :exp)
122
+ expect(formula.to_s) == '.Primitive("~")(cyl, exp)'
123
+ expect formula.typeof == 'language'
124
+ expect formula.rclass == 'formula'
125
+
126
+ formula2 = (:cyl =~ :exp + :exp2 - :exp3)
127
+ expect formula2.to_s == 'cyl ~ .Primitive("-")(.Primitive("+")(exp, exp2), exp3)'
128
+ expect formula.typeof == 'language'
129
+ expect formula.rclass == 'formula'
130
+ end
131
+ =end
132
+
133
+ end
134
+
135
+ end
@@ -0,0 +1,129 @@
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::List do
27
+
28
+ #----------------------------------------------------------------------------------------
29
+ context "When creating lists" do
30
+
31
+ it "should create an empty list" do
32
+ l = R.list
33
+ expect(l.length).to eq 0
34
+ expect(l.class).to eq R::List
35
+ expect(l.typeof).to eq "list"
36
+ end
37
+
38
+ it "should return a list when R.list is called" do
39
+ l = R.list(1, 2)
40
+ expect(l.length).to eq 2
41
+ expect(l.class).to eq R::List
42
+ expect(l.typeof).to eq "list"
43
+ end
44
+
45
+ it "should allow creating list of lists" do
46
+ l = R.list(1, 2, 3, R.list(4, 5, 6))
47
+ expect(l.length).to eq 4
48
+ end
49
+
50
+ it "should allow mixing different types of objects" do
51
+ l = R.list(R.c(1, 2, 3), R.c(1.0, 2.0, 3.0), R.list(a: 1, b: 2, c: 3),
52
+ R.complex(real: R.rnorm(5), imag: R.rnorm(5)))
53
+ end
54
+
55
+ it "should create lists using sequences" do
56
+ x = R.list(a: (1..10), beta: R.exp(-3..3), logic: R.c(true, false, false, true))
57
+ end
58
+
59
+ end
60
+
61
+ #----------------------------------------------------------------------------------------
62
+ context "When subsetting a list" do
63
+
64
+ before(:all) do
65
+ @l = R.list(1, 2, 3, R.list(4, 5, 6))
66
+ end
67
+
68
+ it "should subset with [] and positve integer. Returns a list" do
69
+ expect(@l.length).to eq 4
70
+ # Subsetting a list with [] returns a list
71
+ expect(@l[1].identical(R.list(1))).to eq true
72
+ # the 4th element of the list is a list of a list
73
+ expect(@l[4].identical(R.list(R.list(4, 5, 6)))).to eq true
74
+ end
75
+
76
+ it "should subset with [] and negative integer. Returns a list" do
77
+ expect(@l[-4].identical(R.list(1, 2, 3))).to eq true
78
+ end
79
+
80
+ it "should subset with [] and a vector as index" do
81
+ expect(@l[R.c(4, 1)].identical(R.list(R.list(4, 5, 6), 1))).to eq true
82
+ end
83
+
84
+ it "should subset with [[]] and positive integer. Returns the actual element of the list" do
85
+ # to extract an element of a list we need double square (dbk) indexing
86
+ expect(@l[[1]]).to eq 1
87
+ # dbk indexing to get a list
88
+ expect(@l[[4]].identical(R.list(4, 5, 6))).to eq true
89
+ end
90
+
91
+ it "can chain subsetting operations" do
92
+ # 1rst element of 4th vector is a list
93
+ expect(@l[[4]][1].identical(R.list(4))).to eq true
94
+ expect(@l[[4]][[1]]).to eq 4
95
+ end
96
+
97
+ it "should subset with [[]] with multiple indexes" do
98
+ # Note that for a list or other recursive object, the index can be a vector
99
+ # and each element of the vector is applied in turn to the list, the
100
+ # selected component, the selected component of that component, and so on.
101
+ # The result is still a single element.
102
+ expect(@l[[4, 1]]).to eq 4
103
+ end
104
+
105
+ it "should subset with 'each' returning every element as if subsetting with '[['" do
106
+ i = 1
107
+ @l.each do |elmt|
108
+ if (i < 4)
109
+ expect elmt == i
110
+ else
111
+ expect elmt.identical(R.list(4, 5, 6)) == true
112
+ end
113
+ i = i + 1
114
+ end
115
+ end
116
+
117
+ it "should subset with 'each_with_index'" do
118
+ @l.each_with_index do |elmt, i|
119
+ if (i < 4)
120
+ expect elmt == i
121
+ else
122
+ expect elmt.identical(R.list(4, 5, 6)) == true
123
+ end
124
+ end
125
+ end
126
+
127
+ end
128
+
129
+ end
@@ -0,0 +1,99 @@
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
+ R.require 'stats'
26
+
27
+ describe R::List do
28
+
29
+ context "The apply family of functions with lists" do
30
+
31
+ before(:all) do
32
+ @x = R.list(a: (1..10), beta: R.exp(-3..3), logic: R.c(true, false, false, true))
33
+ R.library("stats")
34
+ # Make @q the function R quantile
35
+ @q = ~:quantile
36
+ end
37
+
38
+ it "should work with lapply and mean" do
39
+ # lapply applies a function to each element of a list or vector, returning a list.
40
+ # compute the list mean for each list element
41
+ mean = R.lapply(@x, "mean")
42
+ expect(mean.a).to eq 5.5
43
+
44
+ # R.all__equal(x,y) is a utility to compare R objects x and y testing
45
+ # “near equality”. If they are different, comparison is still made to some extent,
46
+ # and a report of the differences is returned. Don't use R.all__equal directly
47
+ # in if expressions—either use isTRUE(all.equal(....)) or identical if appropriate.
48
+ # We cannot do mean.beta.all__equal in this case, since mean.beta is a Ruby float
49
+ # and method all__equal is not defined on floats.
50
+ expect(R.all__equal(mean.beta,
51
+ 4.5351252347,
52
+ tolerance: (~:".Machine").double__eps ** 0.5)).to eq true
53
+
54
+ expect(mean.logic).to eq 0.5
55
+ end
56
+
57
+ it "should allow using lapply with quantile" do
58
+ # lapply applies a function to each element of a list or vector, returning a list.
59
+ # median and quartiles for each list element
60
+ quant = R.lapply(@x, @q)
61
+ expect(quant.a[1]).to eq 1
62
+ expect(quant.a["50,00000%"]).to eq 5.50
63
+ expect(R.all__equal(quant.beta["100,0000%"],
64
+ 20.08553692,
65
+ tolerance: (~:".Machine").double__eps ** 0.5)).to eq true
66
+ expect(quant.logic[2]).to eq 0.0
67
+ end
68
+
69
+ it "should allow using method lapply with quantile" do
70
+ x = R.lapply(@x, @q, R.c(0.25, 0.50, 0.75))
71
+ expect(x.a[1]).to eq 3.25
72
+ expect(x.a["50,00000%"]).to eq 5.50
73
+ expect(R.all__equal(x.beta["75,00000%"],
74
+ 5.0536690,
75
+ tolerance: (~:".Machine").double__eps ** 0.5)).to eq true
76
+ expect(x.logic[2]).to eq 0.5
77
+ end
78
+
79
+ it "should allow using sapply and quantile" do
80
+ quant = R.sapply(@x, @q)
81
+ expect quant.rclass == 'matrix'
82
+ expect quant[:all, 'a'] == R.c(1, 3.25, 5.50, 7.75, 10)
83
+ expect quant[3, 'beta'] == 1
84
+ end
85
+
86
+ it "should sapply to a sequence" do
87
+ # sapply isn’t content to always return a list: it attempts to simplify
88
+ # the results into a non-list vector if possible.
89
+ i39 = R.sapply((3..9), "seq")
90
+ expect i39[[1]] == R.c(1, 2, 3)
91
+ expect i39[[7]] == R.c(1, 2, 3, 4, 5, 6, 7, 8, 9)
92
+ sap = R.sapply(i39, ~:fivenum)
93
+ expect sap[1, 1] == 1
94
+ expect sap[5, 7] == 9
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -0,0 +1,83 @@
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 "Matrices" do
30
+
31
+ it "Should create a matrix by column" do
32
+ x = R.matrix(data: R.c(1, 2, 3, 4), nrow: 2, ncol: 2)
33
+ expect(x[1, 1] == 1).to eq true
34
+ expect(x[1, 2] == 3).to eq true
35
+ expect(x.dim == 2).to eq true
36
+ end
37
+
38
+ it "Should create a matrix by row" do
39
+ x = R.matrix(data: R.c(1, 2, 3, 4), nrow: 2, ncol: 2, byrow: true)
40
+ expect(x[1, 1] == 1).to eq true
41
+ expect(x[1, 2] == 2).to eq true
42
+ expect(x.dim == 2).to eq true
43
+ end
44
+
45
+ it "Should add matrices" do
46
+ x = R.matrix(data: R.c(1, 2, 3, 4), nrow: 2, ncol: 2)
47
+ y = R.matrix(data: R.c(2, 4, 6, 8), nrow: 2, ncol: 2)
48
+ z = x + y
49
+ expect(z[1, 1] == 3).to eq true
50
+ expect(z[2, 2] == 12).to eq true
51
+ end
52
+
53
+ it "Should subtract matrices" do
54
+ x = R.matrix(data: R.c(1, 2, 3, 4), nrow: 2, ncol: 2)
55
+ y = R.matrix(data: R.c(2, 4, 6, 8), nrow: 2, ncol: 2)
56
+ z = y - x
57
+ expect(z[1, 1] == 1).to eq true
58
+ expect(z[2, 2] == 4).to eq true
59
+ end
60
+
61
+ it "should multiply by a scalar" do
62
+ y = R.matrix(data: R.c(2, 4, 6, 8), nrow: 2, ncol: 2)
63
+ z = y * 10
64
+ expect(z[1, 1] == 20).to eq true
65
+ expect(z[2, 1] == 40).to eq true
66
+ end
67
+
68
+ it "should divide a scalar by a matrix" do
69
+ y = R.matrix(data: R.c(2, 4, 6, 8), nrow: 2, ncol: 2)
70
+ z = 10/y
71
+ expect(z == R.c(10/2, 10/4, 10/6, 10/8)).to eq true
72
+ end
73
+
74
+ it "should apply a function to all elements of the matrix: ex: sqrt" do
75
+ x = R.matrix(data: R.c(1, 2, 3, 4), nrow: 2, ncol: 2, byrow: true)
76
+ z = x.sqrt
77
+ expect(z[1, 2] == 1.73).to eq true
78
+ expect(z[2, 1] == 1.41).to eq true
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,99 @@
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::Vector do
27
+
28
+ context "When creating vectors" do
29
+
30
+ it "should create logical Vectors" do
31
+ log_vect = R.c(true, false, true, true)
32
+ expect(log_vect.length).to eq 4
33
+ expect(log_vect.class).to eq R::Vector
34
+ expect(log_vect.typeof).to eq "logical"
35
+ expect(log_vect.mode).to eq "logical"
36
+ expect(log_vect.storage__mode).to eq "logical"
37
+ end
38
+
39
+ it "should create integer Vectors" do
40
+ # in R, numbers are converted to double. To get an int one needs to add L after the
41
+ # number 1L is an integer
42
+ int_vect = R.c(1, 2)
43
+ expect(int_vect.length).to eq 2
44
+ expect(int_vect.class).to eq R::Vector
45
+ expect(int_vect.typeof).to eq "integer"
46
+ expect(int_vect.mode).to eq "numeric"
47
+ expect(int_vect.storage__mode).to eq "integer"
48
+ end
49
+
50
+ it "should create double Vectors" do
51
+ float_vect = R.c(3.0, 4, 5)
52
+ expect(float_vect.length).to eq 3
53
+ expect(float_vect.class).to eq R::Vector
54
+ expect(float_vect.typeof).to eq "double"
55
+ expect(float_vect.mode).to eq "numeric"
56
+ expect(float_vect.storage__mode).to eq "double"
57
+ end
58
+
59
+ it "should create character Vectors" do
60
+ # Here the vector has 3 elements
61
+ str_vect = R.c("Hello", "beautiful", "world!")
62
+ expect(str_vect.length).to eq 3
63
+ expect(str_vect.class).to eq R::Vector
64
+ expect(str_vect.typeof).to eq "character"
65
+ expect(str_vect.mode).to eq "character"
66
+ expect(str_vect.storage__mode).to eq "character"
67
+ end
68
+
69
+ it "should create a complex Vector" do
70
+ complex_vec = R.complex(real: R.rnorm(100), imag: R.rnorm(100))
71
+ expect(complex_vec.length).to eq 100
72
+ expect(complex_vec.typeof).to eq "complex"
73
+ expect(complex_vec.mode).to eq "complex"
74
+ expect(complex_vec.storage__mode).to eq "complex"
75
+ end
76
+
77
+ it "should allow creation of vectors of vectors" do
78
+ vect = R.c(1, 2, 3, R.c(4, 5, 6))
79
+ expect(vect.length).to eq 6
80
+ expect(vect.class).to eq R::Vector
81
+ expect(vect[4]).to eq 4
82
+ end
83
+
84
+ it "should create vectors with the use of other R functions" do
85
+ # R.rep repeats the given vector
86
+ vec2 = R.rep(R.c("A", "B", "C"), 3)
87
+ # vec2.pp
88
+ # expect(vec2.identical(R.c("A", "B", "C", "A", "B", "C", "A", "B", "C"))).to eq true
89
+
90
+ # R.table calculates the frequencies of elements
91
+ vec3 = R.c("A", "B", "C", "A", "A", "A", "A", "B", "B")
92
+ table = R.table(vec3)
93
+ # expect(R.c(5, 3, 1).identical table).to eq true
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+