将字符串列表作为输入传递给函数

时间:2016-09-10 00:58:27

标签: r function

我正在尝试使用函数在R中自动执行简单任务。 C是字符变量列表。 mydata - 是数据集。

基本上,我需要将vector C中的每个字符串作为函数的输入。

数据集:

mydata <- structure(list(a = c(1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L), b = c(4L,3L, 1L, 2L, 1L, 5L, 2L, 2L), c = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,1L), d = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), t = c(42L, 34L, 74L,39L, 47L, 8L, 36L, 39L), s = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L)), .Names = c("a", "b", "c", "d", "t", "s"), row.names = c(NA,8L), class = "data.frame") 

代码:

c<-c("a","b","c","d")

plot<-function()
 for (i in c) 
{
  fit<-survfit(Surv(s,t)~paste(i), dat=mydata)
  ggsurvplot(fit, pval = TRUE)  
}
plot()

我遇到以下错误:

  

model.frame.default中的错误(公式= Surv(mydata $ s,mydata $ t)〜   paste(i),:可变长度不同(找到&#39; paste(i)&#39;)

我也试过了重新制定:

积&LT; -function()      for(i in c)     {       survfit(更新(Surv(s,t)〜。,重新制定(i)),data = mydata)       ggsurvplot(fit,pval = TRUE)
    }     情节()

但此代码也会出现此错误:

Error in reformulate(i) : object 'i' not found 

有助于使此代码有效吗?

由于

1 个答案:

答案 0 :(得分:1)

动态构建公式可能很棘手。而不是

fit(Surv(mydata$s,mydata$t)~paste(i), dat=mydata)

使用

fit(update(Surv(s,t)~., reformulate(i)), data=mydata)

您应避免将$与公式一起使用。这里reformualte()有助于从字符串构建公式,update结合了公式的各个部分。如果您想了解更多详细信息,请参阅这些功能的帮助页面。

以下是样本输入

的完整工作版本
#sample input
mydata <- structure(list(a = c(1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L), b = c(4L,3L, 1L, 2L, 1L, 5L, 2L, 2L), c = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,1L), d = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), t = c(42L, 34L, 74L,39L, 47L, 8L, 36L, 39L), s = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L)), .Names = c("a", "b", "c", "d", "t", "s"), row.names = c(NA,8L), class = "data.frame") 
c<-c("a","b","c","d")

和代码

library(survival)
library(survminer)

plot <- function() {
    for (i in c) { 
        fit <- survfit(update(Surv(t,s)~., reformulate(i)), data=mydata)
        ggsurvplot(fit)
    }
}
plot()

当我将其复制/粘贴到R中时,我没有收到任何错误。您必须做的事情与您发布的示例代码不同。