在 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"
- 有没有办法让
do.call
使用双冒号?
- 为了学习:幕后发生了什么导致它
失败了?
根据文档,do.call
的 what
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)
(即反引号中的双冒号运算符是一个函数),其中 pkgname
和 fname
可以是对象或字符命名对象,我们可以使 `::`
成为 do.call
的 what
参数,并在列表中将 pkgname
和 fname
(作为字符)作为 args
参数传递。 fname
命名的函数的参数将出现在 do.call
调用之后。因此:
do.call(what = `::`, args = list("base", "sum"))(1, 2)
使用 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"
- 有没有办法让
do.call
使用双冒号? - 为了学习:幕后发生了什么导致它 失败了?
根据文档,do.call
的 what
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)
(即反引号中的双冒号运算符是一个函数),其中 pkgname
和 fname
可以是对象或字符命名对象,我们可以使 `::`
成为 do.call
的 what
参数,并在列表中将 pkgname
和 fname
(作为字符)作为 args
参数传递。 fname
命名的函数的参数将出现在 do.call
调用之后。因此:
do.call(what = `::`, args = list("base", "sum"))(1, 2)