将“调用”对象转换为 R 中的函数

Posted

技术标签:

【中文标题】将“调用”对象转换为 R 中的函数【英文标题】:Transform a "call" object into a function in R 【发布时间】:2022-01-12 10:05:32 【问题描述】:

从派生中,我得到一个“调用”对象,如代码 sn-p 所示。我想把它转换成一个带参数的函数,但我不知道如何让它正确。它只返回调用对象。

someDeriv <- D(expression(a * x^2 + x), "x")
someDeriv
#returns: a * (2 * x) + 1
class(someDeriv)
#returns: "call"

#here comes the important part
fn <- as.function(alist(a=,x=,someDeriv))

fn(a=1, x=2)
#returns: a * (2 * x) + 1
#should return: 5

【问题讨论】:

【参考方案1】:

alist 引用其参数,因此当您传递变量名称时,它们的值不会在返回的列表中替换。这意味着alist(a =, x =, someDeriv)等同于alist(a =, x =, a * (2 * x) + 1)

someDeriv <- D(expression(a * x^2 + x), "x")
l1 <- alist(a =, x =, someDeriv)
l1
$a


$x


[[3]]
someDeriv
l2 <- alist(a =, x =, a + (2 * x) + 1)
l2
$a


$x


[[3]]
a + (2 * x) + 1

你的函数fn实际上定义为:

fn <- as.function(l1)
fn
function (a, x) 
someDeriv

无论您为ax 传递什么值,fn 都会返回someDeriv 的值,在您的全局环境中是调用a * (2 * x) + 1

要获得你想要的行为,你可以这样做:

l3 <- c(alist(a =, x =), list(someDeriv))
l3
$a


$x


[[3]]
a * (2 * x) + 1
fn <- as.function(l3)
fn(a = 1, x = 2)
[1] 5

【讨论】:

以上是关于将“调用”对象转换为 R 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

将 NULL 指针转换为对象并调用其成员函数之一有实际好处吗?

将 QJsonObject 转换为 Javascript 对象

R语言unlist函数将复杂数据(list列表dataframe字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)

如何将公式转换为变量以与 R 中的 fastLm 函数一起使用

将日期对象转换为日历对象 [重复]

为啥使用 unset() 函数将数组转换为对象?