【问题标题】:R Shiny nested input functions using different dataframes使用不同数据帧的 R Shiny 嵌套输入函数
【发布时间】:2018-02-20 03:42:06
【问题描述】:

我在代表 n=500 和 m=31 的 nXm 矩阵中有 3 个度量(代表 1 个月内的相同度量,包括:(“执行功能”、“工作记忆”、“抑郁”),用于三个不同的“试验” (“Trial1”、“Trial2”、“Trial3”)。我有 6 个不同的矩阵来表示这些数据源的组合(即“Trial1_WM”)。我还有一个对应的变量和相应的日期。

我正在尝试构建一个 R Shiny 应用程序,我可以在其中选择这些数据集的子集以将它们绘制成直方图(即跨所有试验和跨日期范围的 WM,试验 1 的 WM 等)。我已经构建了小部件并构建了应用程序来绘制所有数据。但我无法弄清楚如何使用多个小部件来根据需要对数据进行分段。这是我要构建的所有小部件的一些工作代码,这些小部件目前仅适用于聚合数据(即所有 WM),并带有一个用于分箱数据的滑块:

图书馆(闪亮)

读入数据

Date <- seq(as.Date("2018-01-01"), as.Date("2018-01-31"), by="days")
Date <- as.matrix(t(Date))

N<- 500
M<-31


T1_EF <- matrix( rnorm(N*M,mean=23,sd=3), N, M)
T1_WM <- matrix( rnorm(N*M,mean=30,sd=4), N, M) 
T1_DP <- matrix( rnorm(N*M,mean=30,sd=3.5), N, M)

T2_EF <- matrix( rnorm(N*M,mean=30,sd=3.5), N, M)
T2_WM <- matrix( rnorm(N*M,mean=40,sd=4), N, M) 
T2_DP <- matrix( rnorm(N*M,mean=34,sd=4), N, M)

T3_EF <- matrix( rnorm(N*M,mean=35,sd=3), N, M)
T3_WM <- matrix( rnorm(N*M,mean=35,sd=3), N, M) 
T3_DP <- matrix( rnorm(N*M,mean=40,sd=3), N, M)


Trial1_EF<- as.matrix(round(T1_EF, digits = 6))
Trial2_EF<- as.matrix(round(T2_EF, digits = 6))
Trial3_EF<- as.matrix(round(T3_EF, digits = 6))

Trial1_WM <-as.matrix(round(T1_WM,digits = 6))
Trial2_WM <-as.matrix(round(T2_WM,digits = 6))
Trial3_WM <-as.matrix(round(T3_WM, digits = 6))

Trial1_DP <-as.matrix(round(T1_DP, digits = 6))
Trial2_DP <-as.matrix(round(T2_DP, digits = 6))
Trial3_DP <-as.matrix(round(T3_DP = 6))


# Define UI  ----
ui <- fluidPage(
  titlePanel(code(strong("Tools"), style = "color:black")),
  sidebarLayout(
    sidebarPanel(
      strong("Tools:"),
      selectInput("Test", 
                  label = "Choose a measure to display",
                  choices = c("Executive Functioning", 
                              "Working Memory",
                              "Depression"
                  ),
                  selected = "Executive Functioning"),
      
      selectInput("Study", 
                  label = "Choose a Study to display",
                  choices = c("Trial1", 
                              "Trial2",
                              "Trial3",
                              "All"
                  ),
                  selected = "All"),
      selectInput("Uptake", 
                  label = "Uptake",
                  choices = c("Prior Week", 
                              "Prior Month",
                              "Study to Date"),
                  selected = "Study to Date"),
      
      dateRangeInput("dates", label= "Date range"),
      sliderInput(inputId="slider1", label = "Bins",
                  min = 1, max = 300, value = 200),
      downloadButton("downloadData", "Download")),
    mainPanel(
      code(strong("Study Readout")),
      plotOutput("distPlot")
    ))
)

# Define server logic ----
server <- function(input, output) {
  output$distPlot <- renderPlot({
    slider1 <- seq(floor(min(x)), ceiling(max(x)), length.out = input$slider1 + 1)
    x    <- switch(input$Test, 
                   "Executive Functioning" = cbind(Trial1_EF,Trial2_EF,Trial3_EF),
                   "Working Memory" = cbind(Trial1_WM,Trial2_EF,Trial3_WM), 
                   "Depression" = cbind(Trial1_DP,Trial2_EF,Trial3_DP)
    color <- switch(input$Test, 
                    "Executive Functioning" = "darkgreen",
                    "Working Memory" = "darkorange",
                    "Depression" = "darkviolet")
    
    legend <- switch(input$Test, 
                     "Executive Functioning" = "Executive Functioning",
                     "Working Memory" = "Working Memory",
                     "Depression" = "Depression")
    
    hist(x, breaks = slider1, col=color, main=legend)
    
  })
}


# Run ----
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny widget


    【解决方案1】:

    一种选择是在您的服务器中使用 reactive() 函数。它使您能够对矩阵 x 进行一些操作,这将是 renderPlot() 中使用的矩阵。 例如,如果 Study = 'All' 或 Study = 'Trial1',一个简单的 if 语句将创建一个不同的矩阵。

    server <- function(input, output) {    
    
      filterData <- reactive({    
         if(input$Study == 'All')
            x <- switch(input$Test, 
                   "Executive Functioning" = cbind(Trial1_EF, Trial2_EF, Trial3_EF),
                   "Working Memory"        = cbind(Trial1_WM, Trial2_EF, Trial3_WM), 
                   "Depression"            = cbind(Trial1_DP, Trial2_EF, Trial3_DP))
    
        if(input$Study == 'Trial1')
            x <- switch(input$Test, 
                   "Executive Functioning" = cbind(Trial1_EF),
                   "Working Memory"        = cbind(Trial1_WM), 
                   "Depression"            = cbind(Trial1_DP))
    
        return(x)
      })    
    
      output$distPlot <- renderPlot({     
    
        x <- filterData()        
        slider1 <- seq(floor(min(x)), ceiling(max(x)), length.out = input$slider1 + 1)
    
        [...]
    
        hist(x, breaks = slider1, col = color, main = legend)
      })
    }
    

    您可以根据需要创建任意数量的 reactive()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2017-01-06
      • 2021-08-05
      • 1970-01-01
      • 2020-11-30
      相关资源
      最近更新 更多