r - 如何在基本 R 公式中使用类似 quosure 的语法?
问题描述
我想写一个这样的函数:
library(survival)
getFit = function(x, data){
survfit(Surv(start, stop, event) ~ x, data = data)
}
getFit(surgery, heart)
getFit("surgery", heart) #if not possible, this would be fine too
当然,x
不读。请注意,我使用survfit
withheart
作为示例,但我对几乎每个基于公式的函数(lm、glm 等)都遇到了这个问题。
我知道我可以用paste
and写一些东西as.formula
,但我想知道是否有类似我会做的tidyverse
事情,比如:
getSurvPlot = function(x, data=db){
xx = enquo(x)
survfit(Surv(start, stop, event) ~ !!xx, data = data)
}
最后一个代码也不起作用,但我认为这是因为survfit
它不是tidyverse
.
有没有什么干净的方法可以在 base R 中写出这样的东西?
编辑:在这个例子中,我现在将使用survminer::surv_fit
,它是一个包装器,survfit
允许在公式中具有更大的灵活性。
解决方案
Moody_mudskipper 给出了非常详细的答案。我只是想指出您的定义getSurvPlot
几乎是正确的。您的问题不在于 rlang/tidyverse,而是在另一个公式中使用引用的参数(这是一个公式)。
调用 时getSurvPlot(surgery, heart)
,enquo
会将第一个参数捕获为~surgery
,这已经是一个公式。无需使用~
和 创建新公式xx
,Surv
您只需更新已有公式的左侧即可。这可以使用stats::update()
基础 R 来完成:
getSurvPlot <- function(x, data=db){
xx <- enquo(x)
survfit(stats::update( xx, Surv(start, stop, event) ~ . ), data = data)
}
getSurvPlot(surgery, heart)
现在应该按预期工作。
正如@Moody_mudskipper 所指出的,实际工作由 完成stats::update.formula()
,这是公式对象的S3 泛型 stats::update()
的实现,例如xx
.
推荐阅读
- react-native - React Native 平滑 onResponderMove
- mysql - 除非我更改 `mount` `target`,否则 Docker 容器会立即关闭
- gradle - 为什么我找不到版本 android gradle tools 3.5.4?
- typescript - Mongodb/Mongoose 中的参考用法?
- python - Python数据框从列表中删除句子编号
- pandas - Pandas 按日期分组并在删除重复项时获取计数
- flutter - 如何在自动完成小部件中从外部清除 TextFormField?
- amazon-web-services - 从 Java 程序访问 Amazon S3
- android - 不是让 RN 认为它是电视的方法,即使它不是(修改 uiMode?)
- flutter - 发生异常。RangeError(RangeError(索引):无效值:不在包含范围内 0..4:5)