点到 do.call 函数的 magrittr 管道

magrittr pipe of dot to do.call function

.间接传递给do.call等函数时,magrittr看不到.

会给出错误的示例,因为点不可见。

airquality %>% do.call("mean", list(x = .$Ozone, na.rm = TRUE))

因为 list 对未命名参数 (...) 开放,所以 . 转到第一个参数。这可以表示为

list(., x = .$Ozone)

使用 with 解决问题。

airquality %>% with(., do.call("mean", list(x = Ozone, na.rm = TRUE)))

除非有一个点作为 main 函数的参数,这里 do.call,管道会将左侧插入参数 1。在表达式中使用点不算数。

大括号可以用来禁用自动插入,可以使用with使得with成为主要功能而不是do.call,使用magrittr的%$%管道或使用明确执行您想要的操作的函数。

(请注意,如果参数中有任何 NA,mean 将给出 NA 的结果;要抑制 NA,请添加 na.rm=TRUE 作为 mean 的参数——未显示。)

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)))()