我很难学习如何使用eval()来评估函数,
假设我有一个功能:
sq <- function(y){ y**2 }
你可以像这样评价这个函数:
call <- match.call(expand.dots = FALSE)
call[[1]] <- as.name('sq')
call$y <- 0.2
call <- call[c(1,3)]
eval(call)
它会给你0.2 ^ 2 = 0.04
但如果我想计算像sq(y),其中y = sin(x),我可以写:
call <- match.call(expand.dots = FALSE)
call[[1]] <- as.name('sq')
call$y <- as.name('sin')
call$x <- 0.2
call <- call[c(1,3:4)]
eval(call)
它会给我这个错误:
Error in sq(y = sin, x = 0.2) : unused argument (x = 0.2)
似乎R不能将x识别为sin的参数,而是将sq的参数识别为。我们如何告诉R x是罪的论据?
此外,似乎R是我学过的唯一一种使用eval()来评估函数的语言(我知道C ++和Python,但之前没有看到过这种语法),评估的不同(或优势)是什么这样一个函数而不是调用sq(y = sin(x = 0.2))?
是否有一本好的书或教程谈论它的用法,以及何时在两种方式之间使用?谢谢!
PS:上面的例子实际上是我正在研究的mlogit包中的代码的简化版本,其中通过调用&#39; lnl.slogit&#39;来返回对数可能性。并被传递给&#39; mlogit.optim&#39;并得到优化(https://github.com/cran/mlogit/blob/master/R/mlogit.R的第407行)。我使用与包中的代码相同的方法来调用两个函数,但是我得到了上面的错误。
答案 0 :(得分:1)
代码试图通过:
x
改为sq
但sq
没有x
参数sin
中的函数y
,但需要一个数字,而不是函数。试试这个:
x <- 0.2
cl <- call("sq", y = quote(sin(x)))
cl
## sq(y = sin(x))
eval(cl)
## [1] 0.0394695
或者你想要的是:
x <- 0.2
cl <- call("sq", y = sin(x))
cl
## sq(y = 0.198669330795061)
eval(cl)
## [1] 0.0394695
或
match.fun("sq")(sin(x))
## [1] 0.0394695
或只是:
sq(sin(x))
## [1] 0.0394695
请注意,通常您不必使用eval
。只需使用参数列出函数就足以将其评估为最后一行代码。
由于与环境相关的考虑因素,R中的回归函数内部使用非标准代码,但通常在其他环境中不需要。