用户定义的函数 eval() 函数中出现“找不到对象”错误?
Posted
技术标签:
【中文标题】用户定义的函数 eval() 函数中出现“找不到对象”错误?【英文标题】:"Object not found" error within a user defined function, eval() function? 【发布时间】:2014-03-24 18:12:14 【问题描述】:我正在尝试为需要多次执行的任务编写函数(在多个估算数据集上运行 cox 比例风险函数)。但是,当我将必要的对象传递给我的用户定义函数时,它会给出一个错误,指出找不到该对象。我认为这是因为该对象是在使用 cch() 函数中的“data =”参数指定的数据框中定义的。谁能帮我解决这个问题?
示例数据:
my.list<-list(my.df1 <- data.frame(my.id = 1:100, my.time = rlnorm(100),
my.event= c(rbinom(50,1,0.2),rep(1,50)), my.det=rbinom(100,1,0.5),
sub= c(rep(1,50), rbinom(50, 1, 0.1))), my.df2 <- data.frame(my.id = 1:100,
my.time = rlnorm(100), my.event= c(rbinom(50,1,0.2),rep(1,50)),
my.det=rbinom(100,1,0.5), sub= c(rep(1,50), rbinom(50, 1, 0.1))))
在我的用户定义函数之外,这是可行的:
library(KMsurv)
library(survival)
cch(Surv(my.time,my.event)~as.factor(my.det), data=my.df1, subcoh=~sub,
id=~my.id, cohort.size=500)
但是,这不起作用(这是一个示例函数,而不是真实函数,因为真实函数更复杂,会在多个数据集上运行分析,然后将它们组合起来):
myfun<-function(dflist,time,event)
for (i in 1:length(dflist))
out<-cch(Surv(time,event)~as.factor(my.det), data=dflist[[i]],
subcoh=~sub, id=~my.id, cohort.size=500)
print(out)
myfun(my.list,my.time,my.event)
我收到此错误:“Surv(time, event) 中的错误:找不到对象 'my.time'”。
我发现了一些关于使用 eval(substitute()) 函数来处理类似问题的帖子,但我无法让它工作。任何建议都非常感谢!
【问题讨论】:
您是否打算在更多变量上执行此操作,因此能够输入时间/事件很重要?还是您只想为多个 data.frames 执行此操作? 你确定你没看错?第一件事:您应该将my.det
传递给您的函数,以避免依赖于它在父环境中。其次,我敢打赌你的my.list
有太多的子级列表,所以dflist[[i]]
并没有指向你的想法。
@James Tobin,是的,我需要能够输入不同的时间/事件变量。另外,我希望能够放入不同的决定因素/解释变量,但为了简单起见,我没有提到这一点。但是,给出了同样的错误。
@Carl Witthoft:关于你的第一条评论:我不明白,你能解释一下吗?我也想将 my.det 传递给函数(也可以改变它),但为了简单起见,我现在省略了它。您认为这会导致问题吗?
@Carl Witthoft:关于您的第二条评论:我没有任何子列表。列出的唯一对象是数据框。
【参考方案1】:
试试这个。您需要记住,R 不知道 my.time
和 my.event
是什么。您必须用引号解析它们,然后取消它们才能将其解析为Surv
myfun<-function(dflist,time,event)
for (i in 1:length(dflist))
time <- noquote(time)
event <- noquote(event)
out<-cch(Surv(dflist[[i]][, time], dflist[[i]][, event])~as.factor(my.det), data=dflist[[i]],
subcoh=~sub, id=~my.id, cohort.size=500)
print(out)
myfun(my.list,"my.time","my.event")
【讨论】:
感谢您的建议。您的解决方案有效,但并没有真正解决我的问题,因为我需要能够输入不同的“时间变量”和“事件变量”。最好,我在行列式“my.det”中也很灵活。还有什么建议吗? 是的,我已经编辑了我的答案,它现在适用于您解析的每个变量,请查看上方 哇,它成功了,非常感谢!!为了将来的目的,我会研究这个解析的东西:)以上是关于用户定义的函数 eval() 函数中出现“找不到对象”错误?的主要内容,如果未能解决你的问题,请参考以下文章
请问C程序中,出现了cons.h头文件,是啥,找不到这个头文件,谢谢
找不到列“dbo”或用户定义的函数或聚合“dbo.Splitfn”,或者名称不明确