You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言自定义生存分析绘图函数:参数调用识别问题求助

解决R中函数参数无法在survfit/Surv中识别的问题

看起来你卡在了函数参数传递到survfit()Surv()的环节上,其实核心问题是如何让R正确识别你传入的字符串参数对应的变量名。先给你指出原代码里的两个小问题:一是函数定义时括号不匹配(ggsurvplot的右括号缺失),二是eval(parse())的写法错误,你把~ Area放在了eval范围内,导致语法混乱。

下面给你三种优雅且有效的解决方法,你可以根据自己的习惯选择:

方法1:使用tidyeval(推荐,符合tidyverse风格)

借助rlang包的sym()!!(unquote),可以轻松将字符串参数转换为R能识别的变量符号:

library(survminer)
library(survival)
library(rlang) # 加载rlang包来使用sym和!!

data_km <- data.frame(Duration1 = c(1,2,3,4,5,6,7,8,9,10),
                     Event1 = c(1,1,0,1,1,0,1,1,1,1),
                     Duration2 = c(1,1,2,2,3,3,4,4,5,5),
                     Event2 = c(1,0,1,0,1,1,1,0,1,1),
                     Duration3 = c(11,12,13,14,15,16,17,18,19,20),
                     Event3 = c(1,1,0,1,1,0,1,1,0,1),
                     Area = c(1,1,1,1,1,2,2,2,2,2))

myfun <- function(TimeVar, EventVar){
  # 将字符串参数转换为变量符号
  time_sym <- sym(TimeVar)
  event_sym <- sym(EventVar)
  
  # 用!!取消引用,让survfit识别变量
  ggsurvplot(survfit(Surv(!!time_sym, !!event_sym) ~ Area, data = data_km))
}

# 测试函数
x <- myfun("Duration1", "Event1")
plot(x)

方法2:使用get()函数直接提取变量

get()可以根据字符串名称从指定数据框中提取对应的变量,写法更直观:

myfun_get <- function(TimeVar, EventVar){
  ggsurvplot(survfit(Surv(get(TimeVar, data = data_km), get(EventVar, data = data_km)) ~ Area, data = data_km))
}

# 测试
y <- myfun_get("Duration2", "Event2")
plot(y)

方法3:动态构建公式

把整个生存分析的公式拼接成字符串,再转换为formula对象传给survfit()

myfun_formula <- function(TimeVar, EventVar){
  # 拼接公式字符串
  surv_formula_str <- paste0("Surv(", TimeVar, ", ", EventVar, ") ~ Area")
  # 转换为公式对象
  surv_formula <- as.formula(surv_formula_str)
  
  ggsurvplot(survfit(surv_formula, data = data_km))
}

# 测试
z <- myfun_formula("Duration3", "Event3")
plot(z)

批量生成并排列图形

解决了函数的问题后,你可以用lapply批量生成图形列表,再用gridExtra::grid.arrange排列:

# 定义变量对列表
var_pairs <- list(c("Duration1", "Event1"),
                  c("Duration2", "Event2"),
                  c("Duration3", "Event3"))

# 批量生成图形
plot_list <- lapply(var_pairs, function(pair){
  myfun(pair[1], pair[2])
})

# 排列图形
library(gridExtra)
grid.arrange(grobs = plot_list, ncol = 2)

内容的提问来源于stack exchange,提问作者Peter

火山引擎 最新活动