在 do.call 中指定函数的双冒号运算符

Double colon operator to specify function in do.call

使用 sum 及其等效 do.call 对两个向量求和为

sum(1,2)
do.call("sum", list(1,2))

使用双冒号运算符 (base::sum) 指定 sum 函数将在第一种情况下起作用,但在 do.call 情况下会失败。

base::sum(1,2)
do.call("base::sum", list(1,2))
> Error in `base::sum`(1, 2) : could not find function "base::sum"
  1. 有没有办法让 do.call 使用双冒号?
  2. 为了学习:幕后发生了什么导致它 失败了?

根据文档,do.callwhat arg 将采用 either a function or a non-empty character string naming the function to be called.

如果您尝试实现不带引号的双冒号,它会起作用:

> do.call(base::sum, list(1,2))
[1] 3

因此,虽然包 base 中有一个名为 sum 的函数,但您不能通过同时指定包来命名该函数。相反,只需删除引号。

可以使用do.call调用双冒号运算符,包和函数指定为字符。由于 pkgname::fname 等同于 `::`(pkgname, fname) (即反引号中的双冒号运算符是一个函数),其中 pkgnamefname 可以是对象或字符命名对象,我们可以使 `::` 成为 do.callwhat 参数,并在列表中将 pkgnamefname(作为字符)作为 args 参数传递。 fname 命名的函数的参数将出现在 do.call 调用之后。因此:

do.call(what = `::`, args = list("base", "sum"))(1, 2)