R - 将 survfit 应用于列表并使用相应的名称绘制

R - apply survfit to a list and plot with corresponding names

我有一个命名数据框列表:

library(survival)
library(survminer)

surv.days<- runif(n = 50, min = 0, max = 500)
censor<- sample(c(0,1), 50, replace=TRUE)
survdata<- data.frame(surv.days, censor)
survlist<- list(survdata, survdata)
names(survlist)<- c("name1", "name2")
rm(survdata, censor, surv.days)

我想运行在每个数据帧上进行生存拟合,然后生成几张图(为了简单起见,我在这里只放了一张),每张图都有相应的标题。我认为 Map 是实现它的方法,所以:

titles<- names(survlist)

然后我定义要用于 运行 生存分析和绘图的函数:

survival.function<- function(survivaldata, datanames){
  sfit<- survfit(Surv(surv.days, censor)~1, data=survivaldata)
  ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
             surv.median.line = "v",
             title=datanames,
             risk.table.height=.25)
}

并尝试应用它:

Map(survival.function, survlist, titles)

但是这个想法没有奏效:
"Error in eval(fit$call$data) : object 'survivaldata' not found "
有没有办法将 objects 正确分配给生存函数? 谢谢!

在这种情况下,错误消息似乎具有误导性,至少在我看来是这样。它似乎指向调用 survfit 中的错误,而实际上它是 ggsurvplot 中的错误,从 traceback() 的输出中可以看出。我首先尝试更改传递给 survival.function 的对象的名称。然后没有错误。但也没有情节。所以也在survival.function里面加了一个print调用。我将附上两个结果中的第一个。

survival.function<- function(data, datanames){
  sfit<- survfit(Surv(surv.days, censor)~1, data=data)
  print( ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
             surv.median.line = "v",
             title=datanames,
             risk.table.height=.25) )
}

我希望我能更好地解释为什么这个 hack 有效。 (我只是根据错误消息和 traceback()-结果猜测原因。)我使用的事实是 "missing" 对象的 name 是 "data"。这可能是 ggsurvplot 中的一个语义错误,您会帮助包的维护者向他发送一个 link 到这个完整记录的示例。我想知道如果维护者更改代码以便不使用 $data 而是使用 [[data]].

从环境访问列表成员名称,是否会有可能的改进