忽略magrittr传入的值并将其传递

时间:2018-08-19 02:52:38

标签: r magrittr

是否有一种方法可以在magrittr管道内部使用一个对它的副作用有用的函数(例如assign),并且该函数可以简单地同时获取并传递管道输入的值?

例如,假设我有一个正在处理df的管道,出于某种原因,我想在其中不中断管道的情况下分配一个新对象,并可能稍后在管道中使用该对象:< / p>

df <- mtcars %>%
  rename(mp2 = mpg) %>%
  assign("r", 100, envir = environment()) %>%  # error here
  mutate(mpg2 = mp2 * r)

预期的行为是assign行既将r分配给环境,又将mtcar从上一行传递到下一行,而无需进行修改。

3 个答案:

答案 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