函数作为另一个函数参数返回,在R中使用eval()

函数作为另一个函数参数返回,在R中使用eval(),r,eval,mlogit,R,Eval,Mlogit,我很难学习如何使用eval()计算函数 假设我有一个函数: sq <- function(y){ y**2 } 似乎R不能识别x是罪恶的论元,而是sq的论元。我们怎么能告诉R x是sin的参数呢 此外,R是我所学的唯一一种使用EVAL()来评估函数的语言(我知道C++和Python,但是以前没有看到语法),用这种方法来评估函数有什么不同(或优点)而不是调用SQ(y= Sin(x=0.2))?p> 是否有一本好书或教程介绍它的用法,以及何时在这两种方法之间使用?谢谢 PS:上面的示例实际上

我很难学习如何使用eval()计算函数

假设我有一个函数:

sq <- function(y){ y**2 }
似乎R不能识别x是罪恶的论元,而是sq的论元。我们怎么能告诉R x是sin的参数呢

此外,R是我所学的唯一一种使用EVAL()来评估函数的语言(我知道C++和Python,但是以前没有看到语法),用这种方法来评估函数有什么不同(或优点)而不是调用SQ(y= Sin(x=0.2))?p> 是否有一本好书或教程介绍它的用法,以及何时在这两种方法之间使用?谢谢


PS:上面的示例实际上是我正在研究的mlogit包中代码的简化版本,其中通过调用'lnl.slogit'返回日志可能性,并将其传递给'mlogit.optim'并进行优化(第407行)。我使用与包中代码相同的方法调用了两个函数,但出现了上面的错误。

代码正在尝试传递:

  • 参数
    x
    sq
    但是
    sq
    没有
    x
    参数
  • 参数
    y
    中的函数
    sin
    ,但需要数字,而不是函数
试试这个:

x <- 0.2
cl <- call("sq", y = quote(sin(x)))

cl
## sq(y = sin(x))

eval(cl)
## [1] 0.0394695
或者只是:

sq(sin(x))
## [1] 0.0394695
请注意,通常不必使用
eval
。仅列出函数及其参数就足以将其作为最后一行代码进行计算


由于与环境相关的考虑,R中的回归函数在内部使用非标准代码,但在其他上下文中通常不需要这些代码。

感谢您的回答,但在mlogit包中,它调用这两个函数“lnl.slogit”和“mlogit.optim”的方式与我的示例相同,这两者有什么不同吗?它为什么起作用?”R由于与环境相关的考虑,内部使用非标准代码“我认为您在示例中遗漏了关键部分,即它不是
eval(call)
,而是
eval(call,parent.frame())
因此,任何被计算的表达式都从父帧而不是从mlogit的运行时环境中获取自由变量。
Error in sq(y = sin, x = 0.2) : unused argument (x = 0.2)
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