Skip to content

Commit

Permalink
Add 'exclude' function for dropping variables in 'alter'
Browse files Browse the repository at this point in the history
  • Loading branch information
gdemin committed Jun 7, 2019
1 parent 1ea4909 commit eea1c88
Show file tree
Hide file tree
Showing 10 changed files with 111 additions and 44 deletions.
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: comprehenr
Type: Package
Title: List Comprehensions
Version: 0.6.5
Version: 0.6.6
Maintainer: Gregory Demin <gdemin@gmail.com>
Authors@R: person("Gregory", "Demin", email = "gdemin@gmail.com",
role = c("aut", "cre"))
Expand Down
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

export(alter)
export(enumerate)
export(exclude)
export(lag_list)
export(mark)
export(numerate)
Expand Down
4 changes: 4 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
0.6.6 (07.06.2019)
================
* add 'exclude' function for dropping elements from data.frame/list in 'alter'

0.6.5 (09.04.2019)
================
* add 'alter' function for conditional lists/data.frames modification
Expand Down
27 changes: 23 additions & 4 deletions R/to_list.R
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
#' Expression should be started with \code{for} , \code{while} or
#' \code{repeat}. You can iterate over multiple lists if you provide several
#' loop variables in backticks. See examples.}
#' \item{\code{to_vec}}{ is the same as \code{to_list} but return vector. See examples.}
#' \item{\code{to_vec}}{ is the same as 'to_list' but return vector. See examples.}
#' \item{\code{alter}}{ return the same type as its argument but with modified
#' elements. It is useful for altering existing data.frames or lists. See
#' examples.}
#' \item{\code{exclude}}{ is an auxiliary function for dropping elements in
#' 'alter'. There are no arguments for this function.}
#' }
#' @param expr expression which starts with \code{for} , \code{while} or \code{repeat}.
#' @param recursive logical. Should unlisting be applied to list components of result? See \link[base]{unlist} for details.
Expand Down Expand Up @@ -50,6 +52,10 @@
#' res = alter(for(i in iris) if(is.factor(i)) as.character(i))
#' str(res)
#'
#' # exclude factors from data.frame
#' res = alter(for(i in iris) if(is.factor(i)) exclude())
#' str(res)
#'
#' # 'data' argument example
#' # specify which columns to map with a numeric vector of positions:
#' res = alter(
Expand Down Expand Up @@ -164,16 +170,20 @@ add_assignment_to_loop = function(expr, result_exists = FALSE){
expr[[last_item]] = bquote({
.___curr = {.(expr[[last_item]])}
.___counter = .___counter + 1
if(!is.null(.___curr)){
.___res[[.___counter]] = .___curr
if(inherits(.___curr, "exclude")){
.___res[[.___counter]] = NULL
} else {
if(!is.null(.___curr)){
.___res[[.___counter]] = .___curr
}
}

})
} else {
expr[[last_item]] = bquote({

.___curr = {.(expr[[last_item]])}
if(!is.null(.___curr)){
if(!is.null(.___curr) && !inherits(.___curr, "exclude")){
.___counter = .___counter + 1
.___res[[.___counter]] = .___curr
}
Expand Down Expand Up @@ -201,3 +211,12 @@ alter = function(expr, data = NULL){
res

}


#' @rdname to_list
#' @export
exclude = function(){
res = numeric(0)
class(res) = "exclude"
res
}
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ str(res)
res = alter(for(i in iris) if(is.factor(i)) as.character(i))
str(res)

# drop factors
res = alter(for(i in iris) if(is.factor(i)) exclude())
str(res)

# 'data' argument example
# specify which columns to map with a numeric vector of positions:
res = alter(
Expand Down
11 changes: 10 additions & 1 deletion man/to_list.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions tests/testthat/test_to_list.R
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ expect_identical(
list(1L,3L,5L,7L,9L)
)

expect_identical(
to_list(for(i in 1:10) if(i %% 2 !=0) i else exclude()),
list(1L,3L,5L,7L,9L)
)

expect_identical(
to_list(for(i in 1:10) if(i>1000) i),
list()
Expand Down Expand Up @@ -126,6 +131,11 @@ res_iris = iris
res_iris[,-5] = lapply(iris[,-5], scale)
expect_equal(iris2, res_iris)

data(iris)
iris2 = alter(for(i in iris) if(is.factor(i)) exclude())
res_iris = iris[,-5]
expect_equal(iris2, res_iris)

iris2 = alter(for(`name, value` in mark(iris)) if(endsWith(name, "Width")) scale(value), data = iris)

res_iris = iris
Expand Down
4 changes: 4 additions & 0 deletions vignettes/Introduction.R
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ str(res)
res = alter(for(i in iris) if(is.factor(i)) as.character(i))
str(res)

# drop factors
res = alter(for(i in iris) if(is.factor(i)) exclude())
str(res)

# 'data' argument example
# specify which columns to map with a numeric vector of positions:
res = alter(
Expand Down
88 changes: 50 additions & 38 deletions vignettes/Introduction.html
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,9 @@
code > span.fu { color: #900; font-weight: bold; } code > span.er { color: #a61717; background-color: #e3d2d2; }
</style>




</head>

<body>
Expand Down Expand Up @@ -385,44 +388,53 @@ <h1 class="title toc-ignore">List Comprehensions in R</h1>
<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>
<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>
<a class="sourceLine" id="cb5-29" data-line-number="29"></a>
<a class="sourceLine" id="cb5-30" data-line-number="30"><span class="co"># 'data' argument example</span></a>
<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>
<a class="sourceLine" id="cb5-32" data-line-number="32">res =<span class="st"> </span><span class="kw">alter</span>(</a>
<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>
<a class="sourceLine" id="cb5-34" data-line-number="34"> <span class="dt">data =</span> mtcars</a>
<a class="sourceLine" id="cb5-35" data-line-number="35">)</a>
<a class="sourceLine" id="cb5-36" data-line-number="36"><span class="kw">str</span>(res)</a>
<a class="sourceLine" id="cb5-37" data-line-number="37"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
<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>
<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>
<a class="sourceLine" id="cb5-40" data-line-number="40"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<a class="sourceLine" id="cb5-49" data-line-number="49"></a>
<a class="sourceLine" id="cb5-50" data-line-number="50"><span class="co"># or with a vector of names:</span></a>
<a class="sourceLine" id="cb5-51" data-line-number="51">res =<span class="st"> </span><span class="kw">alter</span>(</a>
<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>
<a class="sourceLine" id="cb5-53" data-line-number="53"> <span class="dt">data =</span> mtcars</a>
<a class="sourceLine" id="cb5-54" data-line-number="54">)</a>
<a class="sourceLine" id="cb5-55" data-line-number="55"><span class="kw">str</span>(res)</a>
<a class="sourceLine" id="cb5-56" data-line-number="56"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
<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>
<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>
<a class="sourceLine" id="cb5-59" data-line-number="59"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<a class="sourceLine" id="cb5-30" data-line-number="30"><span class="co"># drop factors</span></a>
<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>
<a class="sourceLine" id="cb5-32" data-line-number="32"><span class="kw">str</span>(res)</a>
<a class="sourceLine" id="cb5-33" data-line-number="33"><span class="co">#&gt; 'data.frame': 150 obs. of 4 variables:</span></a>
<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>
<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>
<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>
<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>
<a class="sourceLine" id="cb5-38" data-line-number="38"></a>
<a class="sourceLine" id="cb5-39" data-line-number="39"><span class="co"># 'data' argument example</span></a>
<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>
<a class="sourceLine" id="cb5-41" data-line-number="41">res =<span class="st"> </span><span class="kw">alter</span>(</a>
<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>
<a class="sourceLine" id="cb5-43" data-line-number="43"> <span class="dt">data =</span> mtcars</a>
<a class="sourceLine" id="cb5-44" data-line-number="44">)</a>
<a class="sourceLine" id="cb5-45" data-line-number="45"><span class="kw">str</span>(res)</a>
<a class="sourceLine" id="cb5-46" data-line-number="46"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
<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>
<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>
<a class="sourceLine" id="cb5-49" data-line-number="49"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<a class="sourceLine" id="cb5-58" data-line-number="58"></a>
<a class="sourceLine" id="cb5-59" data-line-number="59"><span class="co"># or with a vector of names:</span></a>
<a class="sourceLine" id="cb5-60" data-line-number="60">res =<span class="st"> </span><span class="kw">alter</span>(</a>
<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>
<a class="sourceLine" id="cb5-62" data-line-number="62"> <span class="dt">data =</span> mtcars</a>
<a class="sourceLine" id="cb5-63" data-line-number="63">)</a>
<a class="sourceLine" id="cb5-64" data-line-number="64"><span class="kw">str</span>(res)</a>
<a class="sourceLine" id="cb5-65" data-line-number="65"><span class="co">#&gt; 'data.frame': 32 obs. of 11 variables:</span></a>
<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>
<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>
<a class="sourceLine" id="cb5-68" data-line-number="68"><span class="co">#&gt; $ disp: num 160 160 108 258 360 ...</span></a>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>



Expand Down
4 changes: 4 additions & 0 deletions vignettes/Introduction.rmd
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ str(res)
res = alter(for(i in iris) if(is.factor(i)) as.character(i))
str(res)
# drop factors
res = alter(for(i in iris) if(is.factor(i)) exclude())
str(res)
# 'data' argument example
# specify which columns to map with a numeric vector of positions:
res = alter(
Expand Down

0 comments on commit eea1c88

Please sign in to comment.