链接到2个操作按钮的反应性数据表未更新

时间:2019-07-29 02:23:51

标签: r shiny reactive

我正在构建一个闪亮的应用程序,其目的是从输入数据集生成输出数据集。输入数据集由用户交互子集,然后应用程序将显示这些子组的统计图形输出。然后,用户根据生成的统计图确定子组的一些参数,然后通过两个操作按钮将其输入到输出数据集中。我尚未1.能够将这些参数插入输出表中,并且2.无法在应用启动时显示初始化的输出数据。

这两个参数链接到单独的操作按钮。对我来说,为每个按钮触发器将输出表分配给两个单独的eventReactive调用是有意义的。我认为这也是为什么该应用程序在开始时不显示输出表的原因,因为没有操作按钮触发器来初始化要渲染的表。

UI:

library(tidyverse)
library(dplyr)
library(shiny)
library(DT)

dataIn = data.frame(list(grp1 = rnorm(20), grp2 = rnorm(20,5,3), grp3 = rnorm(20,5,.4) )) %>% gather(key = 'subgroup', value = 'value')
dataOut = data.frame(list(param1 = rep(0,3), param2 = rep(0,3)), row.names = c('x','y','z'))

ui = fluidPage(
  tabsetPanel(
    tabPanel('stats', fluid = FALSE,
  selectInput('subset','Subpopulation', choices = c('grp1', 'grp2', 'grp3')),
  numericInput('param1','Choose parameter 1', 1),
  actionButton('action1','Insert parameter 1'),
  numericInput('param2', 'Choose paramerter 2', 1),
  actionButton('action2', 'Insert parameter 2')
    ),
  tabPanel('table',fluid = FALSE,
    DT::dataTableOutput('table')
  ))
)

服务器:


server = function(input, output, session){
  tableOut = reactive({dataOut})
  tableOut = eventReactive(input$action1,{
    dataOut[c('grp1','grp2','grp3') == input$subset, 1] <<- input$param1
    print(dataOut)
    dataOut})

  tableOut = eventReactive(input$action2,{
    dataOut[c('grp1','grp2','grp3') == input$subset, 2] <<- input$param2
    print(dataOut)
    dataOut
  })

  output$table = DT::renderDataTable(tableOut(), options = list(scrolly = TRUE, 
    length = 100))

  }

同样,我希望输出表在启动时显示。该表格仅在我按下第二个操作按钮后显示。此外,单击第一个操作按钮后,param1根本没有更新,因此似乎看不到第一个eventReactive。我希望将这两个参数分别插入表中,但找不到任何其他解决方案。

1 个答案:

答案 0 :(得分:0)

这是一个没有actionButtons的简化示例。您的主要问题是使用反应性值。请查看一些文档,因为您不应该在闪亮的应用程序中使用全局赋值运算符<<-。有改进的余地,但这应该可行。

全局和用户界面:

library(tidyverse)
library(dplyr)
library(shiny)
library(DT)

dataIn = data.frame(list(grp1 = rnorm(20), grp2 = rnorm(20,5,3), grp3 = rnorm(20,5,.4) )) %>% gather(key = 'subgroup', value = 'value')
dataOut = data.frame(list(param1 = rep(0,3), param2 = rep(0,3)), row.names = c('x','y','z'))

ui = fluidPage(
  tabsetPanel(
    tabPanel('stats', fluid = FALSE,
  selectInput('subset','Subpopulation', choices = c('grp1', 'grp2', 'grp3')),
  numericInput('param1','Choose parameter 1', 1),
  numericInput('param2', 'Choose paramerter 2', 1)
    ),
  tabPanel('table',fluid = FALSE,
    DT::dataTableOutput('table')
  ))
)

服务器:

server = function(input, output, session){
    values = reactiveValues(tableOut = dataOut)
    tableOut = reactive({
        values$tableOut[c('grp1','grp2','grp3') == input$subset, 1] <- input$param1
        values$tableOut[c('grp1','grp2','grp3') == input$subset, 2] <- input$param2
        print(values$tableOut)
    })

    output$table = DT::renderDataTable(tableOut(), options = list(scrolly = TRUE, 
                                                                  length = 100))

}

shinyApp(ui, server)

更新

ui:

library(tidyverse)
library(dplyr)
library(shiny)
library(DT)

dataIn = data.frame(list(grp1 = rnorm(20), grp2 = rnorm(20,5,3), grp3 = rnorm(20,5,.4) )) %>% gather(key = 'subgroup', value = 'value')
dataOut = data.frame(list(param1 = rep(0,3), param2 = rep(0,3)), row.names = c('x','y','z'))

ui = fluidPage(
    tabsetPanel(
        tabPanel('stats', fluid = FALSE,
                 selectInput('subset','Subpopulation', choices = c('grp1', 'grp2', 'grp3')),
                 numericInput('param1','Choose parameter 1', 1),
                 actionButton('action1','Insert parameter 1'),
                 numericInput('param2', 'Choose paramerter 2', 1),
                 actionButton('action2', 'Insert parameter 2')
        ),
        tabPanel('table',fluid = FALSE,
                 DT::dataTableOutput('table')
        ))
)

服务器:

server = function(input, output, session){
    values = reactiveValues(tableOut = dataOut)
    observeEvent(input$action1,{
        values$tableOut[c('grp1','grp2','grp3') == input$subset, 1] <- input$param1
        print(values$tableOut)
    })

    observeEvent(input$action2,{
        values$tableOut[c('grp1','grp2','grp3') == input$subset, 2] <- input$param2
        print(values$tableOut)
    })


    output$table = DT::renderDataTable(values$tableOut, options = list(scrolly = TRUE, 
                                                                  length = 100))

}

shinyApp(ui, server)