当.
被间接传输到类似do.call
的函数时,magrittr
看不到.
。
由于点不可见,将给出错误的示例。
airquality %>% do.call("mean", list(x = .$Ozone, na.rm = TRUE))
除非有一个点作为主函数的参数(此处为do.call
),否则管道将把左手边插入参数1。在表达式中使用点不算数。
大括号可用于禁用自动插入,with
可用于使with
而不是do.call
成为主函数,使用magrittr的%$%
管道或使用明确执行所需操作的函数。
(注意,如果参数中有任何NA,mean
将给出NA的结果;要抑制NA,请添加na.rm=TRUE
作为参数以表示——未显示。)
airquality %>% { do.call("mean", list(x = .$Ozone)) }
airquality %>% with(do.call("mean", list(x = Ozone)))
library(magrittr)
airquality %$% do.call("mean", list(x = Ozone))
# needs R 4.1+ . With earlier versions use function(.) in place of (.)
airquality %>% ((.) do.call("mean", list(x = .$Ozone)))
|>
使用|>管道引入底座R 4.1这些工作,但不是类似于上面的其他工作:
airquality |> with(do.call("mean", list(x = Ozone)))
airquality |> ((.) do.call("mean", list(x = .$Ozone)))()
因为list
对未命名的参数(…)是开放的,所以.
转到第一个参数。这可以表示为
list(., x = .$Ozone)
使用with
解决了这个问题。
airquality %>% with(., do.call("mean", list(x = Ozone, na.rm = TRUE)))