4
votes

comment réparer 'Erreur: les longueurs variables diffèrent (trouvé pour' input $ s ')' dans R Shiny

J'essaie de créer un simple ap brillant pour créer des courbes de survie kaplan-meier stratifiées par sélection effectuée par l'utilisateur. Lorsque je code le calcul KM ​​de manière statique (avec le nom de colonne thorTr), cela fonctionne mais le calcul et le tracé sont statiques. Quand je remplace par input $ s j'obtiens une ERREUR: les longueurs variables diffèrent (trouvé pour 'input $ s')

J'ai essayé de regarder un autre code qui utilise as.formula et coller, mais je ne comprends pas et je n'ai pas pu ne va pas travailler. Mais je suis un nouvel utilisateur de R et Shiny, alors peut-être que je n'ai pas bien compris. Voici un ap brillant similaire mais je veux utiliser survminer et le ggsurvplot pour le traçage

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)

Je m'attends à avoir un tracé qui met à jour la variable de stratification avec la sélection des utilisateurs p >


0 commentaires

3 Réponses :


2
votes

Deux choses:

  1. La formule de l'appel à survfit () doit être définie explicitement. L'objet passé à survfit () dans le code d'origine utilise une valeur de caractère sur le côté droit de la fonction. Cela génère une erreur, que nous pouvons résoudre en traduisant toute la valeur collée en une formule, c'est-à-dire as.formula (paste ('Surv (time, cens) ~', input $ s))
  2. La formule doit être définie dans l'appel à ggsurvplot () pour éviter les problèmes de portée. Ceci est un peu plus technique et concerne la façon dont ggsurvplot () est programmé. Fondamentalement, ggsurvplot () ne peut pas accéder à une formule qui est définie en dehors de son propre appel.

Essayez de remplacer

ggsurvplot(survfit(as.formula(paste('Surv(time,cens) ~',input$s)),data=GBSG2))

par

km <- survfit(Surv(time,cens) ~ input$s ,data=GBSG2)
ggsurvplot(km)


2 commentaires

Erreur: objet 'entrée' introuvable. Vos notes ont cependant du sens.


Merci! Cela m'a encore pris un certain temps à régler.



1
votes

Essayez d'utiliser surv_fit () au lieu de survfit().

surv_fit () est un assistant de survminer qui fait une portée différente de celle de survival: survit () , ce dont vous semblez avoir besoin, comme le suggère Byron.

Mon extrait ressemble à:

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)
})


0 commentaires

1
votes

Bonjour, j'ai enfin réussi à combiner les deux solutions. Je ne comprends pas le correctif mais au moins il fonctionne maintenant comme je le souhaitais :)

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)


0 commentaires