如何正确地限定 R 中数据框的范围以与函数中的公式一起使用

How to correctly scope a dataframe in R to use with a formula in a function

经过一些挖掘 (1, 2, ),似乎有几篇关于在函数中使用公式会导致范围界定问题的帖子,如果我理解正确的话。有些人建议使用环境、分配或 <<- 来解决这个问题,但我一直对如何使用它们感到困惑(并且困惑为什么首先会出现问题)。

让我们试试这个玩具代码:

library(survival)
library(survminer)
set.seed(1)

give_p_val <- function() {
  df <- data.frame('OS' = ovarian[, 'futime'], 'Survival_event' = ovarian[, 'fustat'])
  subgroup <- sample(nrow(df), nrow(df)/2)
  df$Class <- 'A'
  df$Class[subgroup] <- 'B'
  
  fit2 <- survfit(Surv(OS, Survival_event) ~ Class, data=df) 
  return(surv_pvalue(fit2))
}
give_p_val( )

它不起作用,除非您直接 运行 它,这暗示了范围问题。

此代码适用于 return 合适的对象:

survfit(Surv(futime, fustat) ~ rx, data=ovarian)

那么,如果我们在范围内复制数据帧,为什么函数会中断?

testit<-function(){
  ovarian2 <- ovarian
  fit2 <- survfit(Surv(futime, fustat) ~ rx, data=ovarian2)
  return(surv_pvalue(fit2))
}
  
testit()

最终,我如何在函数内生成一个数据框,以便由所使用的公式正确处理? 谢谢!

这是 survminer 包中的一个 known issue,以及 surv_pvalue 如何与 survfit 对象交互。如果您将 survfit 更改为 survminer 包的版本 surv_fit,您的功能将正常工作。

give_p_val <- function() {
  df <- data.frame('OS' = ovarian[, 'futime'], 'Survival_event' = ovarian[, 'fustat'])
  subgroup <- sample(nrow(df), nrow(df)/2)
  df$Class <- 'A'
  df$Class[subgroup] <- 'B'
  fit2 <- surv_fit(Surv(OS, Survival_event) ~ Class, data=df) 
  surv_pvalue(fit2, data = df)
}
give_p_val( )
#   variable      pval   method pval.txt
# 1    Class 0.2615363 Log-rank p = 0.26