用户定义的函数 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.timemy.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() 函数中出现“找不到对象”错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中找不到用户定义的函数

SQL Server 中对用户定义函数的需求是啥?

请问C程序中,出现了cons.h头文件,是啥,找不到这个头文件,谢谢

找不到列“dbo”或用户定义的函数或聚合“dbo.Splitfn”,或者名称不明确

在c语言中自定义了一个函数,在main中调用时提示找不到标识符,怎么办?

linux下链接出现未定义的应用解决方案