Создание функции, передающей свои аргументы функции Surv (или любой другой)

Пожалуйста, обратите внимание на следующее:

Для создания кривой выживания можно использовать функцию survfit пакета survival.

Моя цель — написать функцию, которая (среди прочего) создает такую ​​кривую, но эта функция должна работать с разными data.frames, чьи имена столбцов также различаются. Также группирующая переменная будет зависеть от соответствующего набора данных.

Мне удалось передать функции разные имена data.frame, но предоставление имени столбца для функции survfit и Surv у меня не работает.

Любая помощь приветствуется.

На мой взгляд, это проблема, отличная от простой передачи имени столбца data.frame функции, как обсуждается здесь: Передать имя столбца data.frame в функцию

# required libraries
library(survival)
library(flexsurv)

#### Examples that work without own function ===================================
# survfit wit lung data
survfit(Surv(time = time, event = status) ~ 1, data = lung)
#> Call: survfit(formula = Surv(time = time, event = status) ~ 1, data = lung)
#> 
#>       n  events  median 0.95LCL 0.95UCL 
#>     228     165     310     285     363
survfit(Surv(time = time, event = status) ~ sex, data = lung)
#> Call: survfit(formula = Surv(time = time, event = status) ~ sex, data = lung)
#> 
#>         n events median 0.95LCL 0.95UCL
#> sex=1 138    112    270     212     310
#> sex=2  90     53    426     348     550

# survfit with bc data
survfit(Surv(time = rectime, event = censrec) ~ 1, data = bc)
#> Call: survfit(formula = Surv(time = rectime, event = censrec) ~ 1, 
#>     data = bc)
#> 
#>       n  events  median 0.95LCL 0.95UCL 
#>     686     299    1807    1587    2030

# Create variable function that takes on data specific arguments
SurvFun <- function(fun.time, fun.event, grouping = 1, fun.dat){
  survfit(Surv(time = fun.time, event = fun.event) ~ grouping, data = fun.dat)
}

#### Own function that doesn't work ============================================
# This should work for data = lung
SurvFun(fun.time = time, fun.event = status, grouping = 1, fun.dat = lung)
#> Error in Surv(time = fun.time, event = fun.event): Time variable is not numeric

Создано 05 июля 2018 г. с помощью пакета reprex (v0.2.0).


person Frederick    schedule 05.07.2018    source источник


Ответы (1)


Когда имена столбцов не заключены в кавычки, они передаются как символы. Гораздо сложнее передавать символы, чем простые переменные. Это относится и к формулам. Вам нужно сделать некоторое метапрограммирование, чтобы это работало. Вот один из способов переписать вашу функцию для работы

SurvFun <- function(fun.time, fun.event, grouping = 1, fun.dat) {
  params <- list(fun.time = substitute(fun.time),
    fun.event = substitute(fun.event),
    grouping = substitute(grouping), 
    fun.dat = substitute(fun.data))
  expr <- substitute(survfit(Surv(time = fun.time, event = fun.event) ~ grouping, 
    data = fun.dat), params)
  eval.parent(expr)
}
person MrFlick    schedule 05.07.2018