Skip to content

Commit eea1c88

Browse files
committed
Add 'exclude' function for dropping variables in 'alter'
1 parent 1ea4909 commit eea1c88

File tree

10 files changed

+111
-44
lines changed

10 files changed

+111
-44
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Package: comprehenr
22
Type: Package
33
Title: List Comprehensions
4-
Version: 0.6.5
4+
Version: 0.6.6
55
Maintainer: Gregory Demin <gdemin@gmail.com>
66
Authors@R: person("Gregory", "Demin", email = "gdemin@gmail.com",
77
role = c("aut", "cre"))

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
export(alter)
44
export(enumerate)
5+
export(exclude)
56
export(lag_list)
67
export(mark)
78
export(numerate)

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
0.6.6 (07.06.2019)
2+
================
3+
* add 'exclude' function for dropping elements from data.frame/list in 'alter'
4+
15
0.6.5 (09.04.2019)
26
================
37
* add 'alter' function for conditional lists/data.frames modification

R/to_list.R

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
#' Expression should be started with \code{for} , \code{while} or
55
#' \code{repeat}. You can iterate over multiple lists if you provide several
66
#' loop variables in backticks. See examples.}
7-
#' \item{\code{to_vec}}{ is the same as \code{to_list} but return vector. See examples.}
7+
#' \item{\code{to_vec}}{ is the same as 'to_list' but return vector. See examples.}
88
#' \item{\code{alter}}{ return the same type as its argument but with modified
99
#' elements. It is useful for altering existing data.frames or lists. See
1010
#' examples.}
11+
#' \item{\code{exclude}}{ is an auxiliary function for dropping elements in
12+
#' 'alter'. There are no arguments for this function.}
1113
#' }
1214
#' @param expr expression which starts with \code{for} , \code{while} or \code{repeat}.
1315
#' @param recursive logical. Should unlisting be applied to list components of result? See \link[base]{unlist} for details.
@@ -50,6 +52,10 @@
5052
#' res = alter(for(i in iris) if(is.factor(i)) as.character(i))
5153
#' str(res)
5254
#'
55+
#' # exclude factors from data.frame
56+
#' res = alter(for(i in iris) if(is.factor(i)) exclude())
57+
#' str(res)
58+
#'
5359
#' # 'data' argument example
5460
#' # specify which columns to map with a numeric vector of positions:
5561
#' res = alter(
@@ -164,16 +170,20 @@ add_assignment_to_loop = function(expr, result_exists = FALSE){
164170
expr[[last_item]] = bquote({
165171
.___curr = {.(expr[[last_item]])}
166172
.___counter = .___counter + 1
167-
if(!is.null(.___curr)){
168-
.___res[[.___counter]] = .___curr
173+
if(inherits(.___curr, "exclude")){
174+
.___res[[.___counter]] = NULL
175+
} else {
176+
if(!is.null(.___curr)){
177+
.___res[[.___counter]] = .___curr
178+
}
169179
}
170180

171181
})
172182
} else {
173183
expr[[last_item]] = bquote({
174184

175185
.___curr = {.(expr[[last_item]])}
176-
if(!is.null(.___curr)){
186+
if(!is.null(.___curr) && !inherits(.___curr, "exclude")){
177187
.___counter = .___counter + 1
178188
.___res[[.___counter]] = .___curr
179189
}
@@ -201,3 +211,12 @@ alter = function(expr, data = NULL){
201211
res
202212

203213
}
214+
215+
216+
#' @rdname to_list
217+
#' @export
218+
exclude = function(){
219+
res = numeric(0)
220+
class(res) = "exclude"
221+
res
222+
}

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ str(res)
5858
res = alter(for(i in iris) if(is.factor(i)) as.character(i))
5959
str(res)
6060

61+
# drop factors
62+
res = alter(for(i in iris) if(is.factor(i)) exclude())
63+
str(res)
64+
6165
# 'data' argument example
6266
# specify which columns to map with a numeric vector of positions:
6367
res = alter(

man/to_list.Rd

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test_to_list.R

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ expect_identical(
55
list(1L,3L,5L,7L,9L)
66
)
77

8+
expect_identical(
9+
to_list(for(i in 1:10) if(i %% 2 !=0) i else exclude()),
10+
list(1L,3L,5L,7L,9L)
11+
)
12+
813
expect_identical(
914
to_list(for(i in 1:10) if(i>1000) i),
1015
list()
@@ -126,6 +131,11 @@ res_iris = iris
126131
res_iris[,-5] = lapply(iris[,-5], scale)
127132
expect_equal(iris2, res_iris)
128133

134+
data(iris)
135+
iris2 = alter(for(i in iris) if(is.factor(i)) exclude())
136+
res_iris = iris[,-5]
137+
expect_equal(iris2, res_iris)
138+
129139
iris2 = alter(for(`name, value` in mark(iris)) if(endsWith(name, "Width")) scale(value), data = iris)
130140

131141
res_iris = iris

vignettes/Introduction.R

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ str(res)
4040
res = alter(for(i in iris) if(is.factor(i)) as.character(i))
4141
str(res)
4242

43+
# drop factors
44+
res = alter(for(i in iris) if(is.factor(i)) exclude())
45+
str(res)
46+
4347
# 'data' argument example
4448
# specify which columns to map with a numeric vector of positions:
4549
res = alter(

vignettes/Introduction.html

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,9 @@
289289
code > span.fu { color: #900; font-weight: bold; } code > span.er { color: #a61717; background-color: #e3d2d2; }
290290
</style>
291291

292+
293+
294+
292295
</head>
293296

294297
<body>
@@ -385,44 +388,53 @@ <h1 class="title toc-ignore">List Comprehensions in R</h1>
385388
<a class="sourceLine" id="cb5-27" data-line-number="27"><span class="co">#&gt; $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...</span></a>
386389
<a class="sourceLine" id="cb5-28" data-line-number="28"><span class="co">#&gt; $ Species : chr &quot;setosa&quot; &quot;setosa&quot; &quot;setosa&quot; &quot;setosa&quot; ...</span></a>
387390
<a class="sourceLine" id="cb5-29" data-line-number="29"></a>
388-
<a class="sourceLine" id="cb5-30" data-line-number="30"><span class="co"># 'data' argument example</span></a>
389-
<a class="sourceLine" id="cb5-31" data-line-number="31"><span class="co"># specify which columns to map with a numeric vector of positions:</span></a>
390-
<a class="sourceLine" id="cb5-32" data-line-number="32">res =<span class="st"> </span><span class="kw">alter</span>(</a>
391-
<a class="sourceLine" id="cb5-33" data-line-number="33"> <span class="cf">for</span>(<span class="st">`</span><span class="dt">i, value</span><span class="st">`</span> <span class="cf">in</span> <span class="kw">numerate</span>(mtcars)) <span class="cf">if</span>(i <span class="op">%in%</span><span class="st"> </span><span class="kw">c</span>(<span class="dv">1</span>, <span class="dv">4</span>, <span class="dv">5</span>)) <span class="kw">as.character</span>(value),</a>
392-
<a class="sourceLine" id="cb5-34" data-line-number="34"> <span class="dt">data =</span> mtcars</a>
393-
<a class="sourceLine" id="cb5-35" data-line-number="35">)</a>
394-
<a class="sourceLine" id="cb5-36" data-line-number="36"><span class="kw">str</span>(res)</a>
395-
<a class="sourceLine" id="cb5-37" data-line-number="37"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
396-
<a class="sourceLine" id="cb5-38" data-line-number="38"><span class="co">#&gt; $ mpg : chr &quot;21&quot; &quot;21&quot; &quot;22.8&quot; &quot;21.4&quot; ...</span></a>
397-
<a class="sourceLine" id="cb5-39" data-line-number="39"><span class="co">#&gt; $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...</span></a>
398-
<a class="sourceLine" id="cb5-40" data-line-number="40"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
399-
<a class="sourceLine" id="cb5-41" data-line-number="41"><span class="co">#&gt; $ hp : chr &quot;110&quot; &quot;110&quot; &quot;93&quot; &quot;110&quot; ...</span></a>
400-
<a class="sourceLine" id="cb5-42" data-line-number="42"><span class="co">#&gt; $ drat: chr &quot;3.9&quot; &quot;3.9&quot; &quot;3.85&quot; &quot;3.08&quot; ...</span></a>
401-
<a class="sourceLine" id="cb5-43" data-line-number="43"><span class="co">#&gt; $ wt : num 2.62 2.88 2.32 3.21 3.44 ...</span></a>
402-
<a class="sourceLine" id="cb5-44" data-line-number="44"><span class="co">#&gt; $ qsec: num 16.5 17 18.6 19.4 17 ...</span></a>
403-
<a class="sourceLine" id="cb5-45" data-line-number="45"><span class="co">#&gt; $ vs : num 0 0 1 1 0 1 0 1 1 1 ...</span></a>
404-
<a class="sourceLine" id="cb5-46" data-line-number="46"><span class="co">#&gt; $ am : num 1 1 1 0 0 0 0 0 0 0 ...</span></a>
405-
<a class="sourceLine" id="cb5-47" data-line-number="47"><span class="co">#&gt; $ gear: num 4 4 4 3 3 3 3 4 4 4 ...</span></a>
406-
<a class="sourceLine" id="cb5-48" data-line-number="48"><span class="co">#&gt; $ carb: num 4 4 1 1 2 1 4 2 2 4 ...</span></a>
407-
<a class="sourceLine" id="cb5-49" data-line-number="49"></a>
408-
<a class="sourceLine" id="cb5-50" data-line-number="50"><span class="co"># or with a vector of names:</span></a>
409-
<a class="sourceLine" id="cb5-51" data-line-number="51">res =<span class="st"> </span><span class="kw">alter</span>(</a>
410-
<a class="sourceLine" id="cb5-52" data-line-number="52"> <span class="cf">for</span>(<span class="st">`</span><span class="dt">name, value</span><span class="st">`</span> <span class="cf">in</span> <span class="kw">mark</span>(mtcars)) <span class="cf">if</span>(name <span class="op">%in%</span><span class="st"> </span><span class="kw">c</span>(<span class="st">&quot;cyl&quot;</span>, <span class="st">&quot;am&quot;</span>)) <span class="kw">as.character</span>(value),</a>
411-
<a class="sourceLine" id="cb5-53" data-line-number="53"> <span class="dt">data =</span> mtcars</a>
412-
<a class="sourceLine" id="cb5-54" data-line-number="54">)</a>
413-
<a class="sourceLine" id="cb5-55" data-line-number="55"><span class="kw">str</span>(res)</a>
414-
<a class="sourceLine" id="cb5-56" data-line-number="56"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
415-
<a class="sourceLine" id="cb5-57" data-line-number="57"><span class="co">#&gt; $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...</span></a>
416-
<a class="sourceLine" id="cb5-58" data-line-number="58"><span class="co">#&gt; $ cyl : chr &quot;6&quot; &quot;6&quot; &quot;4&quot; &quot;6&quot; ...</span></a>
417-
<a class="sourceLine" id="cb5-59" data-line-number="59"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
418-
<a class="sourceLine" id="cb5-60" data-line-number="60"><span class="co">#&gt; $ hp : num 110 110 93 110 175 105 245 62 95 123 ...</span></a>
419-
<a class="sourceLine" id="cb5-61" data-line-number="61"><span class="co">#&gt; $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...</span></a>
420-
<a class="sourceLine" id="cb5-62" data-line-number="62"><span class="co">#&gt; $ wt : num 2.62 2.88 2.32 3.21 3.44 ...</span></a>
421-
<a class="sourceLine" id="cb5-63" data-line-number="63"><span class="co">#&gt; $ qsec: num 16.5 17 18.6 19.4 17 ...</span></a>
422-
<a class="sourceLine" id="cb5-64" data-line-number="64"><span class="co">#&gt; $ vs : num 0 0 1 1 0 1 0 1 1 1 ...</span></a>
423-
<a class="sourceLine" id="cb5-65" data-line-number="65"><span class="co">#&gt; $ am : chr &quot;1&quot; &quot;1&quot; &quot;1&quot; &quot;0&quot; ...</span></a>
424-
<a class="sourceLine" id="cb5-66" data-line-number="66"><span class="co">#&gt; $ gear: num 4 4 4 3 3 3 3 4 4 4 ...</span></a>
425-
<a class="sourceLine" id="cb5-67" data-line-number="67"><span class="co">#&gt; $ carb: num 4 4 1 1 2 1 4 2 2 4 ...</span></a></code></pre></div>
391+
<a class="sourceLine" id="cb5-30" data-line-number="30"><span class="co"># drop factors</span></a>
392+
<a class="sourceLine" id="cb5-31" data-line-number="31">res =<span class="st"> </span><span class="kw">alter</span>(<span class="cf">for</span>(i <span class="cf">in</span> iris) <span class="cf">if</span>(<span class="kw">is.factor</span>(i)) <span class="kw">exclude</span>())</a>
393+
<a class="sourceLine" id="cb5-32" data-line-number="32"><span class="kw">str</span>(res)</a>
394+
<a class="sourceLine" id="cb5-33" data-line-number="33"><span class="co">#&gt; 'data.frame': 150 obs. of 4 variables:</span></a>
395+
<a class="sourceLine" id="cb5-34" data-line-number="34"><span class="co">#&gt; $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...</span></a>
396+
<a class="sourceLine" id="cb5-35" data-line-number="35"><span class="co">#&gt; $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...</span></a>
397+
<a class="sourceLine" id="cb5-36" data-line-number="36"><span class="co">#&gt; $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...</span></a>
398+
<a class="sourceLine" id="cb5-37" data-line-number="37"><span class="co">#&gt; $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...</span></a>
399+
<a class="sourceLine" id="cb5-38" data-line-number="38"></a>
400+
<a class="sourceLine" id="cb5-39" data-line-number="39"><span class="co"># 'data' argument example</span></a>
401+
<a class="sourceLine" id="cb5-40" data-line-number="40"><span class="co"># specify which columns to map with a numeric vector of positions:</span></a>
402+
<a class="sourceLine" id="cb5-41" data-line-number="41">res =<span class="st"> </span><span class="kw">alter</span>(</a>
403+
<a class="sourceLine" id="cb5-42" data-line-number="42"> <span class="cf">for</span>(<span class="st">`</span><span class="dt">i, value</span><span class="st">`</span> <span class="cf">in</span> <span class="kw">numerate</span>(mtcars)) <span class="cf">if</span>(i <span class="op">%in%</span><span class="st"> </span><span class="kw">c</span>(<span class="dv">1</span>, <span class="dv">4</span>, <span class="dv">5</span>)) <span class="kw">as.character</span>(value),</a>
404+
<a class="sourceLine" id="cb5-43" data-line-number="43"> <span class="dt">data =</span> mtcars</a>
405+
<a class="sourceLine" id="cb5-44" data-line-number="44">)</a>
406+
<a class="sourceLine" id="cb5-45" data-line-number="45"><span class="kw">str</span>(res)</a>
407+
<a class="sourceLine" id="cb5-46" data-line-number="46"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
408+
<a class="sourceLine" id="cb5-47" data-line-number="47"><span class="co">#&gt; $ mpg : chr &quot;21&quot; &quot;21&quot; &quot;22.8&quot; &quot;21.4&quot; ...</span></a>
409+
<a class="sourceLine" id="cb5-48" data-line-number="48"><span class="co">#&gt; $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...</span></a>
410+
<a class="sourceLine" id="cb5-49" data-line-number="49"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
411+
<a class="sourceLine" id="cb5-50" data-line-number="50"><span class="co">#&gt; $ hp : chr &quot;110&quot; &quot;110&quot; &quot;93&quot; &quot;110&quot; ...</span></a>
412+
<a class="sourceLine" id="cb5-51" data-line-number="51"><span class="co">#&gt; $ drat: chr &quot;3.9&quot; &quot;3.9&quot; &quot;3.85&quot; &quot;3.08&quot; ...</span></a>
413+
<a class="sourceLine" id="cb5-52" data-line-number="52"><span class="co">#&gt; $ wt : num 2.62 2.88 2.32 3.21 3.44 ...</span></a>
414+
<a class="sourceLine" id="cb5-53" data-line-number="53"><span class="co">#&gt; $ qsec: num 16.5 17 18.6 19.4 17 ...</span></a>
415+
<a class="sourceLine" id="cb5-54" data-line-number="54"><span class="co">#&gt; $ vs : num 0 0 1 1 0 1 0 1 1 1 ...</span></a>
416+
<a class="sourceLine" id="cb5-55" data-line-number="55"><span class="co">#&gt; $ am : num 1 1 1 0 0 0 0 0 0 0 ...</span></a>
417+
<a class="sourceLine" id="cb5-56" data-line-number="56"><span class="co">#&gt; $ gear: num 4 4 4 3 3 3 3 4 4 4 ...</span></a>
418+
<a class="sourceLine" id="cb5-57" data-line-number="57"><span class="co">#&gt; $ carb: num 4 4 1 1 2 1 4 2 2 4 ...</span></a>
419+
<a class="sourceLine" id="cb5-58" data-line-number="58"></a>
420+
<a class="sourceLine" id="cb5-59" data-line-number="59"><span class="co"># or with a vector of names:</span></a>
421+
<a class="sourceLine" id="cb5-60" data-line-number="60">res =<span class="st"> </span><span class="kw">alter</span>(</a>
422+
<a class="sourceLine" id="cb5-61" data-line-number="61"> <span class="cf">for</span>(<span class="st">`</span><span class="dt">name, value</span><span class="st">`</span> <span class="cf">in</span> <span class="kw">mark</span>(mtcars)) <span class="cf">if</span>(name <span class="op">%in%</span><span class="st"> </span><span class="kw">c</span>(<span class="st">&quot;cyl&quot;</span>, <span class="st">&quot;am&quot;</span>)) <span class="kw">as.character</span>(value),</a>
423+
<a class="sourceLine" id="cb5-62" data-line-number="62"> <span class="dt">data =</span> mtcars</a>
424+
<a class="sourceLine" id="cb5-63" data-line-number="63">)</a>
425+
<a class="sourceLine" id="cb5-64" data-line-number="64"><span class="kw">str</span>(res)</a>
426+
<a class="sourceLine" id="cb5-65" data-line-number="65"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
427+
<a class="sourceLine" id="cb5-66" data-line-number="66"><span class="co">#&gt; $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...</span></a>
428+
<a class="sourceLine" id="cb5-67" data-line-number="67"><span class="co">#&gt; $ cyl : chr &quot;6&quot; &quot;6&quot; &quot;4&quot; &quot;6&quot; ...</span></a>
429+
<a class="sourceLine" id="cb5-68" data-line-number="68"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
430+
<a class="sourceLine" id="cb5-69" data-line-number="69"><span class="co">#&gt; $ hp : num 110 110 93 110 175 105 245 62 95 123 ...</span></a>
431+
<a class="sourceLine" id="cb5-70" data-line-number="70"><span class="co">#&gt; $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...</span></a>
432+
<a class="sourceLine" id="cb5-71" data-line-number="71"><span class="co">#&gt; $ wt : num 2.62 2.88 2.32 3.21 3.44 ...</span></a>
433+
<a class="sourceLine" id="cb5-72" data-line-number="72"><span class="co">#&gt; $ qsec: num 16.5 17 18.6 19.4 17 ...</span></a>
434+
<a class="sourceLine" id="cb5-73" data-line-number="73"><span class="co">#&gt; $ vs : num 0 0 1 1 0 1 0 1 1 1 ...</span></a>
435+
<a class="sourceLine" id="cb5-74" data-line-number="74"><span class="co">#&gt; $ am : chr &quot;1&quot; &quot;1&quot; &quot;1&quot; &quot;0&quot; ...</span></a>
436+
<a class="sourceLine" id="cb5-75" data-line-number="75"><span class="co">#&gt; $ gear: num 4 4 4 3 3 3 3 4 4 4 ...</span></a>
437+
<a class="sourceLine" id="cb5-76" data-line-number="76"><span class="co">#&gt; $ carb: num 4 4 1 1 2 1 4 2 2 4 ...</span></a></code></pre></div>
426438

427439

428440

vignettes/Introduction.rmd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ str(res)
6868
res = alter(for(i in iris) if(is.factor(i)) as.character(i))
6969
str(res)
7070
71+
# drop factors
72+
res = alter(for(i in iris) if(is.factor(i)) exclude())
73+
str(res)
74+
7175
# 'data' argument example
7276
# specify which columns to map with a numeric vector of positions:
7377
res = alter(

0 commit comments

Comments
 (0)