使用“调用”功能而不进行评估

时间:2018-03-27 08:03:37

标签: r

我正在尝试向对象cb.fit添加一个调用条目。

cb.fit = CoxBoost(
    time=clin.mut$SurvMetastasis_Time,
    status=clin.mut$SurvMetastasis_Event,
    x=as.matrix(clin.mut[,-c(1,4,5)]),
    stepno=1000,
    penalty=100
)

cb.fit$call = call(
    "CoxBoost",
    time=clin.mut$SurvMetastasis_Time,
    status=clin.mut$SurvMetastasis_Event,
    x=as.matrix(clin.mut[ ,-c(1,4,5)]),
    stepno=1000,
    penalty=100
)

虽然

> class(cb.fit$call)
[1] "call"
> names(cb.fit$call)
[1] ""        "time"    "status"  "x"       "stepno"  "penalty"

cb.fit$call实际上是计算值,而不是表达式。 我做错了什么?

我没有看到任何错误,但如果我调用该方法,那么我会获得真正的长列表值。

我用

定义了一个泛型函数和方法
  predictSurvProb = function (x, ...) {
                      UseMethod("predictSurvProb", x)
                      }
  predictSurvProb.iCoxBoost = function(x) predict(x, newdata=clin.mut[ ,2:500], type="logplink")

> a = call("predictSurvProb", cb.fit)
> class(predictSurvProb)
[1] "function"
> a = call("predictSurvProb", cb.fit)
> class(cb.fit)
[1] "iCoxBoost" "CoxBoost"
> class(a)
[1] "call"
> a[[1]]
predictSurvProb
> class(a[[2]])
[1] "iCoxBoost" "CoxBoost"
> names(a[[2]])
 [1] "time"             "status"           "stepno"           "penalty"
 [5] "xnames"           "n"                "p"                "event.times"
 [9] "coefficients"     "linear.predictor" "meanx"            "sdx"
[13] "standardize"      "Lambda"           "scoremat"         "logplik"
[17] "call"             "formula"          "terms"            "cause"
> a[[2]]$time
 [1]  146   40  242   69 2749  627  422 2274 2668   67 1695 1554 1839 1699  391
[16]  981   69 1279 1461 1328 1211 1223 1063   34  362 1082  204  765   67  480
[31]  236  301   90 8747  687 5897  366 1558  247 3817 1533 4104  125 1566 3884
[46] 3915   70   48  223 3903 3655   43 3729 3736 2306 3677 1615 3628 3518 3479
[61] 1000 3228   28

等等。调用对象中的所有条目都具有实际值。

2 个答案:

答案 0 :(得分:0)

您可以使用函数中的函数match.call来返回用于调用该函数的确切调用。

因此,在函数match.call()中调用someFun(a = b + c, 1234)将返回具有该确切内容的调用对象。

您可以使用它来创建所需函数的包装器,并将该调用与函数的实际输出一起返回:

addCall <- function(fun, ...){
  call <- match.call()[-1]

  return(list(call = call, result = fun(...)))
}

结果如下:

> addCall(sum, 1:5)
$call
sum(1:5)

$result
[1] 15

> addCall(sum, 1 + 2 + 3 + 4 + 5)
$call
sum(1 + 2 + 3 + 4 + 5)

$result
[1] 15

match.call()[-1]接听电话,并删除第一个元素。因此它会addCall(sum, 1 + 2 + 3 + 4 + 5),但如果您只对fun的确切调用感兴趣,[-1]会删除第一个元素(addCall),第二个元素(fun)取而代之。

答案 1 :(得分:0)

  

cb.fit$call实际上是计算值,而不是表达式。

不,不是。正如您的class(cb.fit$call)所示,这是未评估的调用表达式。您显示的names是函数调用表达式的参数名称。

使用简化的round示例:

〉 a = 10.1
〉 (x = call("round", a))
round(10.1)
〉 eval(x)
[1] 10

- 在实际强制进行评估之前,不评估任何内容。

...也就是说,除非你在某个地方覆盖了代码另一部分的call函数。确认call实际上已解析为其原始定义,即

function(name, ...) .Primitive("call")