我正在尝试向对象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
等等。调用对象中的所有条目都具有实际值。
答案 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")