Search code examples
rshinysurvminer

ggsurvplot in shiny: Error when p-value = TRUE


I'm trying to do a survival plot in shine, however I have a misbehavior when try to set p-value in the plot. The plot is ok when p-value is disabled. But I get an error when pval = TRUE, saying that it can't find "surv_object" function. Using local variables, it works fine.

rm(list = ls())

library(shiny)
library(shinyauthr)
library(survival)
library(survminer)

time=c(23,6,53,28,8,5,47,2,4,4,8,25,22,6,6,4,25,25,28,28,28,28,30,31,13,33,16,22,28,6,13,23,23,14,21,18,9,13,10,23,34,39,0,4,16,11,30,44)
death=c(1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0)
var=c("Wild","Wild","Wild","Wild","Wild","Wild","Wild","Alt","Wild","Alt","Wild",
        "Wild","Alt","Wild","Wild","Alt","Wild","Wild","Wild","Alt","Wild","Wild",
        "Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild",
        "Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Alt","Wild",
        "Wild","Wild","Alt","Alt")

data = data.frame(
  time = time,
  death = death,
  var = var)

ui = fluidPage(
  fluidRow(
    column(5,
           plotOutput(outputId = "plot1")
    ), 
    column(5,
           plotOutput(outputId = "plot2")
    )
  )
)

server = function(input, output) {
  
  surv_object = reactive({
    so = Surv(time = data$time, event = data$death)
  })
  
  # this works fine
  output$plot1 = renderPlot({
    fit = survfit(formula = surv_object() ~ var, data = data)
   ggsurvplot(fit = fit,  data = data)
  })
  
  # when pval=TRUE, stop works.
  output$plot2 = renderPlot({
    fit = survfit(formula = surv_object() ~ var, data = data)
    ggsurvplot(fit = fit,  data = data, pval = TRUE)
  })
  
}

shinyApp(ui=ui, server = server)

Solution

  • This seems to do the job:

    library(shiny)
    library(survival)
    library(survminer)
    
    time=c(23,6,53,28,8,5,47,2,4,4,8,25,22,6,6,4,25,25,28,28,28,28,30,31,13,33,16,22,28,6,13,23,23,14,21,18,9,13,10,23,34,39,0,4,16,11,30,44)
    death=c(1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0)
    var=c("Wild","Wild","Wild","Wild","Wild","Wild","Wild","Alt","Wild","Alt","Wild",
            "Wild","Alt","Wild","Wild","Alt","Wild","Wild","Wild","Alt","Wild","Wild",
            "Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild",
            "Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Wild","Alt","Wild",
            "Wild","Wild","Alt","Alt")
    
    data = data.frame(
      time = time,
      death = death,
      var = var)
    
    ui = fluidPage(
      fluidRow(
        column(5,
               plotOutput(outputId = "plot2")
        )
      )
    )
    
    server = function(input, output) {
      
      surv_object = reactive(Surv(time = data$time, event = data$death))
      
      output$plot2 = renderPlot({
        ggsurvplot(do.call(survfit,
                list(formula = surv_object() ~ var, data=data)), pval=TRUE)
      })
    }
    
    shinyApp(ui=ui, server = server)