R Shiny App 问题 --> 交互式生存图

Issue with R Shiny App --> Interactive Survival Plots

我是 R Shiny 的新手,我正在尝试构建一个 Shiny Web 应用程序,该应用程序可以生成带有两个反应输入的生存图。第一个输入是研究(总计 = 4)。第二个输入是用于比较生存曲线的组(总计 = 19)。理想情况下,这两个输入将使我能够在特定研究中看到 X 组生存曲线与所有其他组的生存曲线相比如何。

这是我的数据示例:

ObsNum    UniqueID  Time Censored Group Group2 Study
1         523B95015   27        1    1     523     1
2         523B95014   27        1    1     523     1
3         523B85051   27        1    1     523     1
4         523B95009   27        1    1     523     1
5         523B85048   27        1    1     523     1
6         523B85050   27        1    1     523     1
7         675B89002   27        1    8     675     1
8         556B95006   27        1   12     556     1
9         556B85030   27        1   12     556     1
10        556B85044   27        1   12     556     1
11        556B95035   27        1   12     556     1
12        556B95000   27        1   12     556     1
13        556B95004   27        1   12     556     1
14        556B95002   27        1   12     556     1
15        756Y81172   27        1   17     756     1
16        741B95022   27        1   99     741     1
17        741B95020   27        1   99     741     1
18        619B92008   28        1    7     619     1
19        552B89003   28        1   10     552     1
20        101B94097   28        1   99     101     1
21        101B94098   28        1   99     101     1
22        618C84582   29        1   23     618     1
23        618C84580   29        1   23     618     1
24        618C84581   29        1   23     618     1
25        730B90003   29        1   99     730     1
26        646B42015   34        1    4     646     1
27        671B60009   35        1   17     671     1
28        612C80247   35        1   21     612     1
29        700C64500   35        1   99     791     1
30        101B89052   40        1   99     101     1
31        101B85047   40        1   99     101     1
32        101B95068   40        1   99     101     1
33        538B70011   51        1   10     538     1
34        689C85036   57        1    1     689     1
35        689C95450   57        1    1     689     1
36        556B85050   62        1   12     556     1
37        636B80005   62        1   23     636     1
38        636B92002   62        1   23     636     1
39        630B30005   70        1    2     630     1
40        642B80021   78        1    4     642     1
41        101B79173   86        1   99     101     1
42        523B81007  106        0    1     523     1
43        620B88003  106        0    2     620     1
44        642B40002  106        1    4     642     1
45        642B40001  106        1    4     642     1
46        581B81002  106        0    5     581     1
47        581B81001  106        0    5     581     1
48        573B95000  106        0    8     573     1
49        589B80015  106        0   15     589     1
50        589B80016  106        0   15     589     1
51        657B50013  106        0   15     657     1
52        657B43004  106        0   15     657     1
53        459B85085  106        0   21     459     1
54        459Y81171  106        0   21     459     1
55        101B75006  106        0   99     101     1
56        101SC8023  106        0   99     101     1
57        101B85122  106        0   99     101     1
58        101B55116  106        0   99     101     1
59        101B79086  106        0   99     101     1
60        101B95066  106        0   99     101     1
61        730B97005  106        0   99     730     1
62        741B85045  106        0   99     741     1
63        777B96001  106        0   99     777     1
64        556B85077    1        1   12     556     2
65        636B92003    1        1   23     636     2
66        101B94137    1        1   99     101     2
67        700C64500    5        1   99     791     2
68        463Y91171    6        1   20     463     2
69        618C84319    6        1   23     618     2
70        776C93046    6        1   99     776     2
71        556B95042    7        1   12     556     2
72        556B95043    7        1   12     556     2
73        556B97000    7        1   12     556     2
74        549B80069    7        1   17     549     2
75        573B95000   22        1    8     573     2
76        580B90024   22        1   16     580     2
77        523B81007   28        1    1     523     2
78        520B60012   32        1   16     520     2
79        520B70011   32        1   16     520     2
80        586B70008   33        1   16     586     2
81        586B80006   33        1   16     586     2
82        586B80011   33        1   16     586     2
83        586B80015   33        1   16     586     2
84        657B43004   34        1   15     657     2
85        636B99009   35        1   23     636     2
86        691B68018   36        1   22     691     2
87        657B50013   41        1   15     657     2
88        741B95031   42        1   99     741     2
89        620B88003   46        0    2     620     2
90        620B90008   46        0    2     620     2
91        581B81001   46        0    5     581     2
92        581B81002   46        0    5     581     2
93        552B99002   46        0   10     552     2
94        459B85085   46        0   21     459     2
95        459B95055   46        0   21     459     2
96        101B75006   46        0   99     101     2
97        101B55060   46        0   99     101     2
98        101B79086   46        0   99     101     2
99        101B79058   46        0   99     101     2
100       101B85122   46        0   99     101     2
101       101B89115   46        0   99     101     2
102       101B85047   46        0   99     101     2
103       101B94123   46        0   99     101     2
104       101B95091   46        0   99     101     2
105       101B95038   46        0   99     101     2
106       101D98001   46        0   99     101     2
107       730B97005   46        0   99     730     2
108       741B85045   46        0   99     741     2

这是我的 Shiny App 代码:

library(shiny)
library(ggplot2)
library(survival)
library(survminer)
library(dplyr)
attach(tdata)
studychoices=unique(tdata$Study)
groupchoices=unique(tdata$Group)

# Define UI 
ui <- fluidPage(


titlePanel("Survival Data"),
    selectInput(inputId = "studyselector",label="Select a Study:", choices=studychoices),
    selectInput(inputId = "groupselector",label="Select a Group:", choices=groupchoices),
    plotOutput("p1")

)

# Define server logic
server <- function(input, output) {

filter=reactive({
    filteredData=tdata[tdata$Study==input$studyselector,]
    return(filteredData)
})

output$p1=renderPlot({
    fit=survfit(Surv(Time,Censored)~input$groupselector,data=filter())
    ggsurvplot(fit,data=filter(),pval=TRUE,xlim=c(0,max(Time)+1),
               title=paste("Study","INSERT HERE STUDY #", "Survival Plot for Group","INSERT HERE   GROUP #"),
               xlab="Time (Days)",
               ggtheme=theme(plot.title=element_text(hjust=0.5)))
    })

}

# Run the application 
shinyApp(ui = ui, server = server)

我有以下两个问题:

1.) 当我 运行 应用程序时,我在外部 window 中收到一条错误消息,内容为“错误:变量长度不同(为‘input$groupselector’找到)”。那里此数据中没有 NA,我指定要使用的数据是基于研究选择的 filter() 数据集,所以我不确定为什么会弹出此错误。

2.) 如何动态更改标题中的 Study # 和 Group #?我知道如何使用普通的 R 函数来做到这一点,但我对 Shiny 设置有点迷茫。

如有任何帮助,我们将不胜感激!谢谢!

已编辑解决方案

这现在应该可以工作了 - 已将 Group 列编辑为二进制 in/out 当传递给您的反应性数据框时,它应该适当地为行着色:

library(tidyverse)
library(survival)
library(survminer)
library(shiny)

ui <- fluidPage(


  titlePanel("Survival Data"),
  selectInput(inputId = "studyselector",label="Select a Study:", choices=studychoices),
  selectInput(inputId = "groupselector",label="Select a Group:", choices=groupchoices),
  plotOutput("p1")

)

# Define server logic
server <- function(input, output) {

  filter=reactive({
    filteredData=data[data$Study==input$studyselector,]
    filteredData['Group'] = ifelse(filteredData$Group==input$groupselector,
                                   input$groupselector,
                                   "Others")
    return(filteredData)
  })

  output$p1=renderPlot({
    fit=survfit(Surv(Time,Censored)~Group,data=filter())  # `Group` as variable to stratify by?
    ggsurvplot(fit,data=filter(),pval=TRUE,xlim=c(0,max(filter()$Time)+1),
               title=paste("Study",
                           input$studyselector,  # paste these bits straight in
                           "Survival Plot for Group",
                           input$groupselector), # here too
               xlab="Time (Days)",
               ggtheme=theme(plot.title=element_text(hjust=0.5)))
  })

}

# Run the application 
shinyApp(ui = ui, server = server)

如果有任何错误或进一步的错误,请在评论中告诉我ideas/questions!