函数返回另一个函数参数,在R

时间:2018-05-16 18:01:46

标签: r eval mlogit

我很难学习如何使用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行)。我使用与包中的代码相同的方法来调用两个函数,但是我得到了上面的错误。

1 个答案:

答案 0 :(得分:1)

代码试图通过:

  • 参数x改为sqsq没有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中的回归函数内部使用非标准代码,但通常在其他环境中不需要。