как исправить «Ошибка: длины переменных различаются (найдено для ‘input$s’)» в R Shiny

Я пытаюсь сделать простое блестящее приложение для создания кривых выживания Каплана-Мейера, которые стратифицируются в зависимости от выбора, который делает пользователь. Когда я статически кодирую расчет KM (с именем столбца thorTr), он работает, но расчет и график являются статическими. Когда я заменяю input$s, я получаю ОШИБКУ: длины переменных различаются (найдено для 'input$s')

Я пытался посмотреть на другой код, который использует as.formula и вставляет, но я не понимаю и не могу приступить к работе. Но я новый пользователь 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)

Я ожидаю иметь график, который обновляет переменную стратификации с выбором пользователей.


person R. Cantor    schedule 06.01.2019    source источник


Ответы (3)


Две вещи:

  1. Формула в вызове survfit() должна быть определена явно. Объект, передаваемый в survfit() в исходном коде, использует символьное значение в правой части функции. Это вызывает ошибку, которую мы можем устранить, переведя все вставленное значение в формулу, т. е. as.formula(paste('Surv(time,cens) ~',input$s))
  2. Формула должна быть определена в вызове 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))
person Byron Casey Jaeger    schedule 07.01.2019
comment
Ошибка: объект «вход» не найден. Хотя ваши заметки имеют смысл. - person Paul; 16.01.2019
comment
Спасибо! Это все еще заняло у меня некоторое время, чтобы разобраться. - person R. Cantor; 19.01.2019

Попробуйте использовать 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 <- surv_fit(as.formula(formula_text), data=os_df)
    ggsurvplot(fit = fit, data=os_df)
})
person Paul    schedule 16.01.2019

Привет, наконец, заставил это работать, сочетая оба решения. Я не понимаю исправления, но, по крайней мере, теперь оно работает так, как я хотел :)

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)
person R. Cantor    schedule 19.01.2019
comment
Возможно, surv_fit вместо survit имел значение, согласно другим ответам - person Paul; 03.03.2021