首页 > 解决方案 > R函数找不到作为参数提供的对象

问题描述

我正在尝试创建一个函数,该函数采用数据框,对每个基因(列)执行生存分析,并打印重要的生存曲线。我的数据如下所示,其中狗名作为行名,基因作为列名,最后两列是无病间隔(DFI,生存时间指标),以及是否应该审查样本(1)或不审查(0)。

狗的名字 基因1 基因2 友通 审查
狗 1 高的 低的 130 0
狗 2 低的 高的 88 1

我有多个狗的数据框,所以我希望创建一个函数来避免重新输入相同的代码。以下代码在我自己运行时有效,但是当我尝试使用它创建函数时出现错误。

library(survival)
library(survminer)
survPlot <- function(x){
  s <- Surv(x$DFI, x$Censor)
  for (i in 1:(ncol(x)-2)){
    n_high <- length(which(x[,i] == "High"))
    n_low <- length(which(x[,i] == "Low"))
    sfit <- survfit(s ~ x[,i])
    pval <- surv_pvalue(sfit, data = as.data.frame(x))$pval
    if (pval <= 0.05){
      abc <- ggsurvplot(sfit, data = as.data.frame(x[,i]), pval = T, title = colnames(x)[i], legend.labs = c(paste0("High Expression", "\n", "n =", n_high), paste0("Low Expression", "\n", "n =", n_low)))
      print(abc)
    }
  }
}
survPlot(mydata)

我收到错误 Error in FUN(X[[i]], ...) : object 'x' not found,但 x 是函数中的参数,所以我不明白发生了什么。

**编辑

这是我的数据示例

mydata <- structure(list(`cfa-miR-142` = c("High", "Low", "High", "Low", 
"Low", "Low", "Low", "Low", "Low", "Low"), `hsa-miR-133b` = c("Low", 
"High", "Low", "Low", "High", "Low", "High", "Low", "High", "Low"
), `hsa-miR-20a-5p` = c("Low", "High", "Low", "High", "High", 
"High", "High", "High", "High", "High"), `hsa-miR-19a-3p` = c("High", 
"Low", "Low", "High", "High", "Low", "High", "High", "High", 
"High"), `hsa-miR-222-3p` = c("Low", "Low", "Low", "Low", "Low", 
"Low", "High", "Low", "Low", "Low"), `hsa-miR-451a` = c("Low", 
"High", "Low", "Low", "High", "High", "High", "High", "High", 
"High"), `cfa-miR-221` = c("Low", "Low", "Low", "Low", "Low", 
"Low", "Low", "Low", "Low", "Low"), `cfa-miR-1` = c("High", "Low", 
"High", "Low", "High", "Low", "Low", "High", "High", "Low"), 
    `hsa-miR-185-5p` = c("Low", "Low", "Low", "Low", "Low", "Low", 
    "Low", "Low", "Low", "Low"), `hsa-miR-145-5p` = c("High", 
    "Low", "High", "High", "High", "Low", "Low", "Low", "High", 
    "Low"), DFI = c(99, 1008, 238, 861, 277, 285, 26, 277, 591, 
    415), Censor = c(1, 0, 1, 0, 1, 1, 0, 1, 1, 1)), row.names = c("Dog_1", 
"Dog_2", "Dog_3", "Dog_4", "Dog_5", "Dog_6", "Dog_7", "Dog_8", 
"Dog_9", "Dog_10"), class = "data.frame") 

标签: r

解决方案


这些功能似乎很挑剔。看起来他们不能很好地容忍非标准的列名。我已添加make.names()以确保列名是有效的变量名。我还使用了不同的方法来构建公式。尝试这个

survPlot <- function(x){
  names(x) <- make.names(names(x))
  for (i in 1:(ncol(x)-2)){
    n_high <- length(which(x[,i] == "High"))
    n_low <- length(which(x[,i] == "Low"))
    form <- eval(bquote(Surv(DFI, Censor)~.(as.name(names(x)[i]))))
    sfit <- do.call("survfit", list(form, data=quote(x)))
    pval <- surv_pvalue(sfit, data=x)$pval
    if (!is.na(pval) & pval <= 0.05){
      abc <- ggsurvplot(sfit, data=x, pval = T, title = colnames(x)[i], legend.labs = c(paste0("High Expression", "\n", "n =", n_high), paste0("Low Expression", "\n", "n =", n_low)))
      print(abc)
    }
  }
}
survPlot(mydata)

推荐阅读