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 >
3 Réponses :
Deux choses:
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))
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)
Erreur: objet 'entrée' introuvable. Vos notes ont cependant du sens.
Merci! Cela m'a encore pris un certain temps à régler.
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) })
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)