将类函数的对象转换为函数

时间:2017-01-05 15:55:42

标签: r function closures

在R中,假设一个类型为' closure'名为my_object,包含似然函数和相关参数。

进一步假设我现在想要从所述对象中具体提取似然函数并将其传递给另一个R命令,该命令需要一个似然函数作为其第一个参数。我可以通过库unenclose中的pryr命令提取所述函数。

> library(pryr)
> lik_func = unenclose(my_object)
> lik_func
function (pars, condition.surv = TRUE, root = ROOT.OBS, root.p = NULL, 
    intermediates = FALSE) 
{ #function_specifics_here# }
<environment: namespace:diversitree>

然而,我显然提取的只是类&#39;函数&#39; 的对象,而不是似然函数本身,因为下一个R命令抱怨它实际上没有收到一个函数,但是一个对象:

> asr.marginal(lik=lik_func, pars=my_pars)
Error in UseMethod("make.asr.marginal") : 
  no applicable method for 'make.asr.marginal' applied to an object of class "function"

如果将类&#39;函数&#39; 对象转换为普通的函数,假设实际存在这样的区别,该怎么办?

注意:我不确定是否或为什么实际存在类&#39;函数&#39; 对象和普通函数之间的区别。也许回答这个问题的人也可以对此有所了解。

1 个答案:

答案 0 :(得分:0)

“类"function"的对象”通常是 1 ,起作用。特别是,它们是"closure"和类"function"类型的对象。

使用pryr::unenclose在这里没有任何有用的效果。它的唯一作用是获取一个函数,并用它们的值替换对封闭环境中对象的所有引用。如果我有,请说:

x = 1
f = function () x

...然后unenclose(f)将产生:

function () 1

这不会使f更多或更少的功能。

您的错误消息似乎与此基本无关。相反,asr.marginal特别需要似然函数,这显然需要由程序包中的make.*函数之一创建。 上下文中的似然函数是类"dtlik"的函数。

1 例外情况是,如果你容易出现恶作剧:

x = 42
class(x) = "function"

现在x有类功能,但显然不是函数。