【问题标题】:Issue with R Shiny App --> Interactive Survival PlotsR Shiny App 的问题 --> 交互式生存图
【发布时间】:2020-07-31 01:35:24
【问题描述】:

我是 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.) 当我运行应用程序时,我在外部窗口中收到错误消息,显示“错误:可变长度不同(为'input$groupselector' 找到)。此数据中没有 NA,我指定了要使用的数据是基于 Study 选择的 filter() 数据集,所以我不确定为什么会弹出这个错误。

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

任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: r ggplot2 shiny survival


    【解决方案1】:

    修改后的解决方案

    现在应该可以工作了 - 已将 Group 列编辑为在传递给您的反应式数据帧时的二进制输入/输出,这应该适当地为行着色:

    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)
    

    如果有任何错误或进一步的想法/问题,请在 cmets 中告诉我!

    【讨论】:

    • 谢谢!这很棒!我的图表根据研究选择动态变化。但是,我想要发生的是让情节只显示 2 条曲线:(选定的组,然后所有其他组结合起来,例如:如果我们有第 4 组,则 4 与非 4)
    • 我还编辑了我的示例数据,以便更好地了解我正在使用的内容
    • 我知道你在找什么!现在已经编辑了解决方案。 filter() 数据框的 Group 列现在将读取为组号或“其他”,并在公式中用作参数来衡量输入/输出以进行比较。希望这会有所帮助!
    • 你摇滚!按预期工作!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多