是否有一种方法可以在magrittr管道内部使用一个对它的副作用有用的函数(例如assign
),并且该函数可以简单地同时获取并传递管道输入的值?
例如,假设我有一个正在处理df的管道,出于某种原因,我想在其中不中断管道的情况下分配一个新对象,并可能稍后在管道中使用该对象:< / p>
df <- mtcars %>%
rename(mp2 = mpg) %>%
assign("r", 100, envir = environment()) %>% # error here
mutate(mpg2 = mp2 * r)
预期的行为是assign
行既将r分配给环境,又将mtcar从上一行传递到下一行,而无需进行修改。
答案 0 :(得分:2)
像这样在{...}中放置最后两个语句。它将r
保留在{...}
的本地,以便在{...}完成后r
将被自动清理(即删除)。
mtcars %>%
rename(mp2 = mpg) %>%
{
assign("r", 100, envir = environment())
mutate(., mpg2 = mp2 * r)
}
在这种情况下,我们可以编写:
mtcars %>%
rename(mp2 = mpg) %>%
{
r <- 100
mutate(., mpg2 = mp2 * r)
}
如果您要添加后续语句,则如果它们不涉及r
,只需将下一个%>%
放在}
之后,或者如果确实涉及r
开始通过将%>%
放在mutate(...)
中的{...}
之后,将第二个管道嵌套在第一个管道中。
答案 1 :(得分:2)
有3种方法,具体取决于函数是否取决于管道内部的计算。
1)要调用的函数与管道无关。在这种情况下,只需在开始管道之前调用该函数:
gst-launch-1.0 version 1.14.2
GStreamer 1.10.4
Unknown package origin
2)该函数需要管道输入,但是您出于副作用而调用它。这是@Thomas指出的assign("r", 100, envir = environment())
df <- mtcars %>%
rename(mpg2 = mpg) %>%
mutate(mpg2 = mpg2 * r)
管道所在的位置:< / p>
magrittr::%T>%
3)该功能需要应用到输入的每个元素(例如数据框中的每个列),但是您需要该功能以产生副作用。 f <- function(x) {cat( "Calling f on", class(x), "\n")} # Side effect is printing
df <- mtcars %>%
rename(mpg2 = mpg) %T>% ## This pipe is defined inside magrittr package
f() %>%
mutate(mpg2 = mpg2 * r)
## Calling f on data.frame
:
purrr::walk()
答案 2 :(得分:1)
也许创建一个“接收器”管道运算符,该运算符在不与LHS有任何连接的情况下评估RHS,然后返回LHS。
<div class="messagebox">Hello World!</div>
请注意,我相信您的原始代码中有错别字:`%V%` <- function(lhs, rhs) {rhs; lhs}
不会被定义。
mpg2