你如何调用一个在管道中不接受输入的函数?

How do you call a function that takes no inputs within a pipeline?

我尝试搜索此问题,但找不到任何类似的问题。比方说,为了一个简单的例子,我想使用 dplyr 的管道 %>%.

执行以下操作

c(1,3,5) %>% ls() %>% mean()

撇开像这样的管道的用例是什么,我如何调用不需要来自左侧并将它们传递给管道中的下一个函数?基本上,我想在我的管道中加入某种“间歇”或“中断”,让该功能完成它的工作,然后继续我的快乐之路。 显然,以上实际上不起作用,我知道 T 管道 %T>% 在这里也没有用,因为它仍然期望中间函数需要输入来自lhs。这里是否有避免分配中间对象和重新启动管道的选项?

我不知道是否有内置函数,但您当然可以为此创建一个辅助函数

> callfun <- function(x, fun){fun(); return(x)}
> c(1, 3, 5) %>% callfun(fun = ls) %>% mean()
# [1] 3

我真的不明白这一点,但是嘿 - 这是你的生活。

使用“magrittr”管道运算符,您可以将操作数放入 {…} 以防止自动参数替换:

c(1,3,5) %>% {ls()} %>% mean()
# NA
# Warning message:
# In mean.default(.) : argument is not numeric or logical: returning NA

…但这当然没有任何用处。

顺便说一下,管道内的 ls() 是在它自己的环境而不是调用环境中执行的,因此它在这里的使用甚至 less 有用。但是可以使用返回合理值 的不同函数 ,例如:

c(1,3,5) %>% {rnorm(10)} %>% mean()
# [1] -0.01068046

或者,如果您打算传递左侧,跳过中间部分 ls(),您可以执行以下操作:

c(1,3,5) %>% {ls(); .} %>% mean()
# [1] 3

... 同样,在这里使用 ls() 没有任何意义,但其他一些有副作用的函数会起作用。

您可以像这样定义一个辅助函数,它接受一个它不使用的参数以使其适合管道:

ls_return_x <- function(x){
  print(ls()) 
  x
}
c(1,3,5) %>% ls() %>% mean()

请注意,此示例中的 ls() 调用将在 ls_return_x() 函数内打印环境中的对象。如果您想从全局环境中打印环境,请查看 ls() 的帮助页面。