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.
- checksums.yaml +7 -0
- data/README.md +32 -0
- data/Rakefile +177 -0
- data/bin/galaaz +8 -0
- data/examples/50Plots_MasterList/scatter_plot.rb +51 -0
- data/examples/baseball.csv +1 -0
- data/examples/baseball.rb +16 -0
- data/examples/ggplot.rb +178 -0
- data/examples/islr/Figure.jpg +0 -0
- data/examples/islr/all.rb +32 -0
- data/examples/islr/ch2.spec.rb +148 -0
- data/examples/islr/ch3.spec.rb +28 -0
- data/examples/islr/ch3_boston.rb +77 -0
- data/examples/islr/ch3_multiple_regression.rb +36 -0
- data/examples/islr/ch6.spec.rb +64 -0
- data/examples/paper/paper.rb +36 -0
- data/examples/sthda_ggplot/README.md +38 -0
- data/examples/sthda_ggplot/all.rb +68 -0
- data/examples/sthda_ggplot/one_variable_continuous/density_gg.rb +52 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_area.rb +61 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_density.rb +77 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_dotplot.rb +69 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_freqpoly.rb +69 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_histogram.rb +62 -0
- data/examples/sthda_ggplot/one_variable_continuous/histogram_density.rb +55 -0
- data/examples/sthda_ggplot/one_variable_continuous/stat.rb +62 -0
- data/examples/sthda_ggplot/one_variable_discrete/bar.rb +54 -0
- data/examples/sthda_ggplot/qplots/box_violin_dot.rb +57 -0
- data/examples/sthda_ggplot/qplots/scatter_plots.rb +67 -0
- data/examples/sthda_ggplot/scatter_gg.rb +60 -0
- data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_bin2d.rb +49 -0
- data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_density2d.rb +64 -0
- data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_hex.rb +52 -0
- data/examples/sthda_ggplot/two_variables_cont_cont/geom_point.rb +65 -0
- data/examples/sthda_ggplot/two_variables_cont_cont/geom_smooth.rb +66 -0
- data/examples/sthda_ggplot/two_variables_cont_cont/misc.rb +83 -0
- data/examples/sthda_ggplot/two_variables_cont_function/geom_area.rb +63 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_bar.rb +85 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_boxplot.rb +62 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_dotplot.rb +75 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_jitter.rb +74 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_line.rb +55 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_violin.rb +70 -0
- data/examples/sthda_ggplot/two_variables_disc_disc/geom_jitter.rb +40 -0
- data/examples/sthda_ggplot/two_variables_error/geom_crossbar.rb +108 -0
- data/examples/subsetting.rb +372 -0
- data/lib/expression.rb +45 -0
- data/lib/galaaz.rb +27 -0
- data/lib/r.rb +118 -0
- data/lib/r_methods.rb +89 -0
- data/lib/rbinary_operators.rb +226 -0
- data/lib/rclosure.rb +34 -0
- data/lib/rdata_frame.rb +63 -0
- data/lib/renvironment.rb +34 -0
- data/lib/rexpression.rb +34 -0
- data/lib/rindexed_object.rb +68 -0
- data/lib/rlanguage.rb +64 -0
- data/lib/rlist.rb +72 -0
- data/lib/rmatrix.rb +38 -0
- data/lib/rmd_indexed_object.rb +43 -0
- data/lib/robject.rb +297 -0
- data/lib/rpkg.rb +53 -0
- data/lib/rsupport.rb +292 -0
- data/lib/rsupport_scope.rb +77 -0
- data/lib/rsymbol.rb +57 -0
- data/lib/ruby_callback.rb +83 -0
- data/lib/ruby_extensions.rb +74 -0
- data/lib/runary_operators.rb +58 -0
- data/lib/rvector.rb +117 -0
- data/r_requires/ggplot.rb +31 -0
- data/specs/all.rb +45 -0
- data/specs/r_dataframe.spec.rb +181 -0
- data/specs/r_eval.spec.rb +164 -0
- data/specs/r_function.spec.rb +105 -0
- data/specs/r_language.spec.rb +135 -0
- data/specs/r_list.spec.rb +129 -0
- data/specs/r_list_apply.spec.rb +99 -0
- data/specs/r_matrix.spec.rb +83 -0
- data/specs/r_vector_creation.spec.rb +99 -0
- data/specs/r_vector_functions.spec.rb +59 -0
- data/specs/r_vector_object.spec.rb +94 -0
- data/specs/r_vector_operators.spec.rb +174 -0
- data/specs/r_vector_subsetting.spec.rb +136 -0
- data/specs/tmp.rb +134 -0
- data/version.rb +2 -0
- metadata +198 -0
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
#--------------------------------------------------------------------------------------
|
|
29
|
+
#
|
|
30
|
+
#--------------------------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
it " should match two vectors with %in%" do
|
|
33
|
+
vec1 = R.c(1, 2, 3, 4)
|
|
34
|
+
vec2 = R.c(1, 2, 3, 4)
|
|
35
|
+
vec3 = R.c(3, 4, 5)
|
|
36
|
+
vec4 = R.c(4, 5, 6, 7)
|
|
37
|
+
|
|
38
|
+
# R has functions defined with '%%' notation. In order to access those functions
|
|
39
|
+
# from SciCom we use the '._' method with two arguments, the first argument is the
|
|
40
|
+
# name of the function, for instance, function %in%, the name of the method is ':in'
|
|
41
|
+
# Ex: vec1 %in% vec2 => vec1._ :in, vec2
|
|
42
|
+
expect((vec1._ :in, vec2).identical(R.c(true, true, true, true))).to eq true
|
|
43
|
+
expect((vec1._ :in, vec3).identical(R.c(false, false, true, true))).to eq true
|
|
44
|
+
expect((vec2._ :in, vec4).identical(R.c(false, false, false, true))).to eq true
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
=begin
|
|
51
|
+
it "should allow adding elements to the vector" do
|
|
52
|
+
R.eval(<<-R)
|
|
53
|
+
vec = c(2.1, 4.2, 3.3, 5.4);
|
|
54
|
+
print(order(vec));
|
|
55
|
+
R
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
=end
|
|
59
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
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 assigning attributes to a Vector" do
|
|
29
|
+
|
|
30
|
+
before(:each) do
|
|
31
|
+
@vect = R.c(1, 2, 3, 4, 5, 6)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should assign names to vectors" do
|
|
35
|
+
# set names
|
|
36
|
+
@vect.names = R.c("a", "b", "c", "d", "e", "f")
|
|
37
|
+
expect(@vect.names.identical(R.c("a", "b", "c", "d", "e", "f"))).to eq true
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should assign a dim to vector" do
|
|
41
|
+
# set dim
|
|
42
|
+
@vect.dim = R.c(3, 2)
|
|
43
|
+
expect(@vect.dim[1]).to eq 3
|
|
44
|
+
expect(@vect.dim[2]).to eq 2
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should assign row.names to a vector with dimention" do
|
|
48
|
+
@vect.dim = R.c(3, 2)
|
|
49
|
+
# set row.names
|
|
50
|
+
@vect.row__names = R.c("A", "B", "C")
|
|
51
|
+
expect(@vect.row__names.identical(R.c("A", "B", "C")))
|
|
52
|
+
# note that when accessing row__names[2] we are getting a native ruby object
|
|
53
|
+
# and not a vector. This might change in future versions
|
|
54
|
+
expect(@vect.row__names[2]).to eq "B"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should set the class of the object using rclass" do
|
|
58
|
+
# set the R class. Note that we need to use rclass instead of class, since
|
|
59
|
+
# class is a Ruby keyword
|
|
60
|
+
@vect.rclass = "myClass"
|
|
61
|
+
expect(@vect.rclass).to eq "myClass"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should set the attribute of a Vector using attr" do
|
|
65
|
+
# the other alternative is to use method attr to change the attribute
|
|
66
|
+
@vect.attr = {which: "class", value: "newClass"}
|
|
67
|
+
expect(@vect.rclass).to eq "newClass"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should allow changing an element of a vector attribute" do
|
|
71
|
+
# pending "Need to implement new function for this"
|
|
72
|
+
# set names
|
|
73
|
+
@vect.names = R.c("a", "b", "c", "d", "e", "f")
|
|
74
|
+
@vect.names[2] = "hello"
|
|
75
|
+
expect(@vect.names[2]).to eq "hello"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "When passing named arguments" do
|
|
81
|
+
|
|
82
|
+
it "Named arguments should become the names of the vector" do
|
|
83
|
+
vect = R.c(a: 1, b: 2, c: 3, d: 4)
|
|
84
|
+
expect(vect.names.identical(R.c("a", "b", "c", "d"))).to eq true
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "should allow adding names to sub-vectors" do
|
|
88
|
+
vect = R.c(1, 2, 3, a: R.c(1, 2, 3), b: 5, c: 6)
|
|
89
|
+
expect(vect.names.identical(R.c("", "", "", "a1", "a2", "a3", "b", "c"))).to eq true
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
@@ -0,0 +1,174 @@
|
|
|
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
|
+
#----------------------------------------------------------------------------------------
|
|
29
|
+
context "Arithmetic operators" do
|
|
30
|
+
|
|
31
|
+
before(:each) do
|
|
32
|
+
@vec1 = R.c(3, 5.7, 10, 12)
|
|
33
|
+
@vec2 = R.c(2.3, 3, 9, 17)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should add two vectors" do
|
|
37
|
+
res = @vec1 + @vec2
|
|
38
|
+
expect(res.all__equal(R.c(5.3, 8.7, 19, 29))).to eq true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should subtract two vectors" do
|
|
42
|
+
res = @vec1 - @vec2
|
|
43
|
+
expect(res.all__equal(R.c(0.7, 2.7, 1.0, -5.0))).to eq true
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should multiply two vectors" do
|
|
47
|
+
res = @vec1 * @vec2
|
|
48
|
+
expect(res.all__equal(R.c(6.9, 17.1, 90.0, 204.0))).to eq true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should exponentiate two vectors" do
|
|
52
|
+
res = @vec1 ** @vec2
|
|
53
|
+
expect(res.all__equal(R.c(3**2.3, 5.7**3, 10**9, 12**17))).to eq true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should divide two vectors" do
|
|
57
|
+
res = @vec1 / @vec2
|
|
58
|
+
expect(res.all__equal(R.c(3/2.3, 5.7/3, 10/9.0, 12.0/17))).to eq true
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should calculate the modulus of two vectors" do
|
|
62
|
+
res = @vec1 % @vec2
|
|
63
|
+
expect(res.all__equal(R.c(3%2.3, 5.7%3, 10%9.0, 12.0%17))).to eq true
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should apply unary minus to all elements of a vector" do
|
|
67
|
+
expect((-@vec1).all__equal(R.c(-3, -5.7, -10, -12))).to eq true
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should operate with Numeric first" do
|
|
71
|
+
res = 10 + @vec1
|
|
72
|
+
expect(res == R.c(13, 15.7, 20, 22)).to eq true
|
|
73
|
+
res = 10 - @vec1
|
|
74
|
+
expect(res == R.c(7, 4.3, 0, -1)).to eq true
|
|
75
|
+
res = 10 / @vec1
|
|
76
|
+
expect(res == R.c(3.3333333, 1.7543860, 1, 0.8333333)).to eq true
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
#----------------------------------------------------------------------------------------
|
|
82
|
+
context "Comparison operators" do
|
|
83
|
+
|
|
84
|
+
it "should check vectors for equality / inequality" do
|
|
85
|
+
vec1 = R.c(1, 2)
|
|
86
|
+
vec2 = R.c(1, 2)
|
|
87
|
+
vec3 = R.c(0, 2)
|
|
88
|
+
|
|
89
|
+
expect((vec1 == vec2).all__equal(R.c(true, true))).to eq true
|
|
90
|
+
expect((vec1 != vec2).all__equal(R.c(false, false))).to eq true
|
|
91
|
+
expect((vec1 == vec3).all__equal(R.c(false, true))).to eq true
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should check vectors for <, <=, >, >=" do
|
|
95
|
+
vec1 = R.c(1, 2, 3)
|
|
96
|
+
vec2 = R.c(0, 4, 3)
|
|
97
|
+
|
|
98
|
+
expect((vec1 < vec2).all__equal(R.c(false, true, false))).to eq true
|
|
99
|
+
expect((vec1 <= vec2).all__equal(R.c(false, true, true))).to eq true
|
|
100
|
+
expect((vec1 > vec2).all__equal(R.c(true, false, false))).to eq true
|
|
101
|
+
expect((vec1 >= vec2).all__equal(R.c(true, false, true))).to eq true
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
#----------------------------------------------------------------------------------------
|
|
107
|
+
context "Logical operators" do
|
|
108
|
+
|
|
109
|
+
before(:each) do
|
|
110
|
+
@vec1 = R.c(true, true, false, true)
|
|
111
|
+
@vec2 = R.c(true, false, false, false)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "should negate a vector" do
|
|
115
|
+
expect((!@vec1).all__equal(R.c(false, false, true, false))).to eq true
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "should 'and' and 'or' two vectors" do
|
|
119
|
+
expect((@vec1 & @vec2).all__equal R.c(true, false, false, false)).to eq true
|
|
120
|
+
expect((@vec1 | @vec2).all__equal R.c(true, true, false, true)).to eq true
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
#----------------------------------------------------------------------------------------
|
|
126
|
+
context "Access from Ruby" do
|
|
127
|
+
|
|
128
|
+
before(:each) do
|
|
129
|
+
@vec1 = R.c(3, 5.7, 10, 12)
|
|
130
|
+
@vec2 = R.c(2.3, 3, 9, 17)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "Should retrieve Numeric values from a vector with '<<'" do
|
|
134
|
+
# subsetting a vector with '[' and '[[' returns an R::Vector, not a Numeric object
|
|
135
|
+
# Use the '<<' operator to retrieve an element of the R::Vector as a Numeric
|
|
136
|
+
# object
|
|
137
|
+
expect(@vec1[1].is_a? R::Vector).to eq true
|
|
138
|
+
expect((@vec1 << 0).is_a? Numeric).to eq true
|
|
139
|
+
|
|
140
|
+
# Note, however, that indexing starts at 0
|
|
141
|
+
expect((@vec1 << 0)).to eq 3
|
|
142
|
+
expect((@vec1 << 2)).to eq 10
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "should treat R::Vector as an Enumerable" do
|
|
146
|
+
# each 'value' is an R::Vector, with only 1 element. In order to use Ruby 'sum'
|
|
147
|
+
# we need to extract the value as a Ruby Numeric with << 1
|
|
148
|
+
expect(@vec1.sum { |value| value << 0 }).to eq 30.7
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "should implement 'pop' to extract the first element of an R::Vector" do
|
|
152
|
+
# pop is equivalent to '<< 1'
|
|
153
|
+
expect(@vec1.pop).to eq 3
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "should allow storage and retrieval of Ruby Objects in R data structure" do
|
|
157
|
+
|
|
158
|
+
class RData
|
|
159
|
+
def val
|
|
160
|
+
5
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Using 'c' to add an external element, transforms the vector into a list
|
|
165
|
+
vec3 = R.c(RData.new, RData.new)
|
|
166
|
+
|
|
167
|
+
expect(vec3[[1]].is_a? RData).to eq true
|
|
168
|
+
expect(vec3[[1]].val == 5).to eq true
|
|
169
|
+
expect(vec3[[2]].val == 5).to eq true
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
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 subsetting a Vector" do
|
|
29
|
+
|
|
30
|
+
before(:all) do
|
|
31
|
+
@vect = R.c(1, 2, 3, 4, 5)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should subset vector with integer obtaining a single element" do
|
|
35
|
+
# indexing a vector with a positive interger returns the value at the index
|
|
36
|
+
expect(@vect[1]).to eq 1
|
|
37
|
+
expect(@vect[3]).to eq 3
|
|
38
|
+
expect(@vect[5]).to eq 5
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should subset a vector with a negative integer obtaining a Vector" do
|
|
42
|
+
# a vector when indexed with a negative integer, is a vector without the
|
|
43
|
+
# given element. So, we are here removing the second element of the vector
|
|
44
|
+
# which leave us with the second element being 3
|
|
45
|
+
expect(@vect[-2].identical(R.c(1, 3, 4, 5))).to eq true
|
|
46
|
+
expect(@vect[-3].identical(R.c(1, 2, 4, 5))).to eq true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should subset a vector with another integer vector" do
|
|
50
|
+
expect(@vect[R.c(2, 4)][1]).to eq 2
|
|
51
|
+
expect(@vect[R.c(2, 4)][2]).to eq 4
|
|
52
|
+
expect(@vect[R.c(3, 3)][2]).to eq 3
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "should allow reordering of elements based on function" do
|
|
56
|
+
vect = R.c(2.1, 4.2, 3.3, 5.4)
|
|
57
|
+
expect(vect[R.order(vect)][2]).to eq 3.3
|
|
58
|
+
expect(vect[R.order(vect)][3]).to eq 4.2
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should subset with another character vector" do
|
|
62
|
+
x = R.c("m", "f", "u", "f", "f", "m", "m")
|
|
63
|
+
lookup = R.c(m: "Male", f: "Female", u: R::NA)
|
|
64
|
+
|
|
65
|
+
res = R.c("Male", "Female", R::NA, "Female", "Female", "Male", "Male")
|
|
66
|
+
res.names = R.c("m", "f", "u", "f", "f", "m", "m")
|
|
67
|
+
|
|
68
|
+
expect(lookup[x].all__equal res).to eq true
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "should subset with 'each'" do
|
|
72
|
+
i = 1
|
|
73
|
+
@vect.each do |elmt|
|
|
74
|
+
expect(elmt.typeof == 'integer').to eq true
|
|
75
|
+
expect(elmt == i).to eq true
|
|
76
|
+
i += 1
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should subset with 'each_with_index'" do
|
|
81
|
+
# note that the index starts at 1, since we are getting back an R::Vector
|
|
82
|
+
# element
|
|
83
|
+
@vect.each_with_index do |elmt, i|
|
|
84
|
+
expect(elmt.typeof == 'integer').to eq true
|
|
85
|
+
expect elmt == i
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should subset with 'each(:native)' getting back a native Ruby element (not R::Vector)" do
|
|
90
|
+
# in order to access the internal Ruby element from the R::Vector, use 'each' with
|
|
91
|
+
# the :native keyword
|
|
92
|
+
@vect.each(:native) do |elmt|
|
|
93
|
+
expect(elmt.is_a? Numeric).to eq true
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "should subset with 'each_with_index(:native)' getting a Ruby element" do
|
|
98
|
+
# when using the :native keyword, indexing starts at 0
|
|
99
|
+
@vect.each_with_index(:native) do |elmt, i|
|
|
100
|
+
expect elmt == i + 1
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
#----------------------------------------------------------------------------------------
|
|
107
|
+
context "When subseting with double square brackets" do
|
|
108
|
+
|
|
109
|
+
it "should retrieve values the same way as single square brackets" do
|
|
110
|
+
vect = R.c(2.1, 4.2, 3.3, 5.4)
|
|
111
|
+
expect vect[[1]] == 2.1
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
#----------------------------------------------------------------------------------------
|
|
117
|
+
context "When subset assigning to a vector" do
|
|
118
|
+
|
|
119
|
+
before(:all) do
|
|
120
|
+
@vect = R.c(1, 2, 3, 4, 5)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should subset assign with integer" do
|
|
124
|
+
expect(@vect[2]).to eq 2
|
|
125
|
+
@vect[2] = 1000
|
|
126
|
+
expect @vect[2] == 1000
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should subset assign to the elements given by another vector" do
|
|
130
|
+
@vect[R.c(2, 3)] = R.c(1000, 2000)
|
|
131
|
+
expect(@vect.identical(R.c(1, 1000, 2000, 4, 5))).to eq true
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|