【问题标题】:R - Defining a function which recognises arguments not as objects, but as being part of the callR - 定义一个函数,该函数将参数识别为不是对象,而是作为调用的一部分
【发布时间】:2020-05-16 02:20:04
【问题描述】:

我正在尝试定义一个在 R 中返回图形对象的函数。我的想法是,然后我可以使用 for 循环或 lapply 函数多次使用不同的参数调用此函数,然后绘制列表grobs 中的 gridExtra::grid.arrange。但是,我还没有走到那一步。我无法将 r 识别为调用的一部分。我已经编写了一些代码来向您展示我的问题。我尝试引用和取消引用参数,在函数中使用unqoute() ("Object not found" error within a user defined function, eval() function?),使用eval(parse()) (R - how to filter data with a list of arguments to produce multiple data frames and graphs),使用!! 等。但是,我似乎无法理解工作。有谁知道我应该如何处理?

library(survminer)
library(survival)

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))

# this is working perfectly
ggsurvplot(survfit(Surv(Duration1, Event1) ~ Area, data = data_km))
ggsurvplot(survfit(Surv(Duration2, Event2) ~ Area, data = data_km))
ggsurvplot(survfit(Surv(Duration3, Event3) ~ Area, data = data_km))

myfun <- function(TimeVar, EventVar){
  ggsurvplot(survfit(Surv(eval(parse(text = TimeVar), eval(parse(text = EventVar)) ~ Area, data = data_km))
}

x <- myfun("Duration1", "Event1")
plot(x)

【问题讨论】:

  • 这个问题并不是真正针对生存分析,而是适用于任何涉及 R 公式的拟合函数。

标签: r plot user-defined-functions indirection standard-evaluation


【解决方案1】:

你需要学习一些关于语言计算的教程。我喜欢用基础 R 来做,例如,使用 bquote

myfun <- function(TimeVar, EventVar){
  TimeVar <- as.name(TimeVar)
  EventVar <- as.name(EventVar) 

  fit <- eval(bquote(survfit(Surv(.(TimeVar), .(EventVar)) ~ Area, data = data_km)))
  ggsurvplot(fit)
}

x <- myfun("Duration1", "Event1")
print(x)
#works

【讨论】:

  • 此解决方案完美运行。但是,在我的函数中,我还想使用 TimeVar 的最大值。我正在尝试这个MaxTimeVar &lt;- eval(bquote(max(data_km$.(TimeVar)))),但它给出了一个错误。使用$ 标志时,它的工作方式是否有所不同?
  • $ 进行非标准评估并干扰bquote$ 仅供交互使用。你可以使用bquote(max(data_km[[.(TimeVar)]])),但是如果你使用原始字符值(在使用as.name之前),你可以简单地使用max(data_km[[Timevar]]),这样会更好。
  • 美丽。谢谢你。会学习一些关于这方面的教程,还有很多东西要学。
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 2017-10-21
  • 1970-01-01
  • 2022-10-05
  • 2013-03-20
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
相关资源
最近更新 更多