我正在构建一个闪亮的应用程序,其目的是从输入数据集生成输出数据集。输入数据集由用户交互子集,然后应用程序将显示这些子组的统计图形输出。然后,用户根据生成的统计图确定子组的一些参数,然后通过两个操作按钮将其输入到输出数据集中。我尚未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。我希望将这两个参数分别插入表中,但找不到任何其他解决方案。
答案 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)