Как исправить 'Ошибка: переменные длины отличаются (найдено для'input$s')' в R Shiny
Я пытаюсь сделать простой блестящий ап для создания кривых выживания Каплана-Мейера, которые стратифицированы выбором, который делает пользователь. Когда я кодирую расчет КМ статически (с именем столбца thorTr), он работает, но расчет и график статичны. Когда я заменяю на input$s, я получаю ERROR: переменные длины отличаются (найдено для 'input$s')
Я пытался посмотреть на другой код, который использует as.formula и paste, но я не понимаю и не могу приступить к работе. Но я новый пользователь R и Shiny, так что, возможно, я не понял это правильно. Вот похожий блестящий ап, но я хочу использовать Survminer и ggsurvplot для построения
library(shiny)
library(ggplot2)
library(survival)
library(survminer)
#load data
data(GBSG2, package = "TH.data")
#Define UI for application that plots stratified km curves
ui <- fluidPage(
# Sidebar layout with a input and output definitions
sidebarLayout(
# Inputs
sidebarPanel(
# Select variable strat
selectInput(inputId = "s",
label = "Select Stratification Variable:",
choices = c("horTh","menostat","tgrade"),
selected = "horTh")
),
# Outputs
mainPanel(
plotOutput(outputId = "km")
)
)
)
# Define server function required to create the km plot
server <- function(input, output) {
# Create the km plot object the plotOutput function is expecting
output$km <- renderPlot({
#calc KM estimate with a hard coded variables - the following line works but obviously is not reactive
#km <- survfit(Surv(time,cens) ~ horTh,data=GBSG2)
#replaced hard coded horTh selection with the respnse from the selection and I get an error
km <- survfit(Surv(time,cens) ~ input$s ,data=GBSG2)
#plot km
ggsurvplot(km)
})
}
# Create a Shiny app object
shinyApp(ui = ui, server = server)
Я ожидаю иметь график, который обновляет переменную стратификации с выбором пользователей
3 ответа
Попробуйте использовать surv_fit()
вместо survfit()
,
surv_fit()
является помощником от survminer
что делает разные области видимости по сравнению с survival:survit()
, что вам, как кажется, нужно, как предполагает Байрон.
Мой фрагмент выглядит так:
output$plot <- renderPlot({
formula_text <- paste0("Surv(OS, OS_CENSOR) ~ ", input$covariate)
## for ggsurvplot, use survminer::surv_fit instead of survival:survfit
fit <- survfit(as.formula(formula_text), data=os_df)
ggsurvplot(fit = fit, data=os_df)
})
Две вещи:
- Формула в призыве к
survfit()
должно быть определено явно. Объект передаетсяsurvfit()
в исходном коде используется символьное значение в правой части функции. Это приводит к ошибке, которую мы можем устранить, переведя все вставленное значение в формулу, т.е.as.formula(paste('Surv(time,cens) ~',input$s))
- Формула должна быть определена в вызове
ggsurvplot()
чтобы избежать проблем с ограничением объема работ. Это немного более технически и связано с тем, какggsurvplot()
запрограммирован. В принципе,ggsurvplot()
не может получить доступ к формуле, которая определена за пределами ее собственного вызова.
Попробуйте заменить
km <- survfit(Surv(time,cens) ~ input$s ,data=GBSG2)
ggsurvplot(km)
с
ggsurvplot(survfit(as.formula(paste('Surv(time,cens) ~',input$s)),data=GBSG2))
Привет, наконец, получил это на работу, объединив оба решения. Я не понимаю, как исправить, но, по крайней мере, теперь оно работает так, как я хотел:)
library(shiny)
library(ggplot2)
library(survival)
library(survminer)
data(GBSG2, package = "TH.data")
# Define UI for application that plots features of movies
ui <- fluidPage(
# Sidebar layout with a input and output definitions
sidebarLayout(
# Inputs
sidebarPanel(
# Select variable strat
selectInput(inputId = "s",
label = "Select Stratification Variable:",
choices = c("Hormone Therapy" = "horTh",
"Menopausal Status" = "menostat",
"Tumor Grade" = "tgrade"),
selected = "horTh")
),
# Outputs
mainPanel(
plotOutput(outputId = "km")
)
)
)
# Define server function required to create the scatterplot
server <- function(input, output) {
# Create the km plot object the plotOutput function is expecting
output$km <- renderPlot({
## calc survival curve and plot
kmdata <- surv_fit(as.formula(paste('Surv(time,cens) ~',input$s)),data=GBSG2)
ggsurvplot(kmdata)
})
}
# Create a Shiny app object
shinyApp(ui = ui, server = server)