R / RShiny范围界定-全球环境,避免重新计算反应输出?

时间:2018-11-05 16:11:28

标签: r shiny shiny-server shinydashboard reactive

对于用户何时更改Shiny中的输入值以及如何有效地响应该更改,我有一个普遍的问题。

首先,我将在单词上画图,然后尝试创建与代码有关的最低版本。

操作:用户更改下拉菜单以选择特定项目。

反应:基于该用户输入的过滤器功能将应用于输出变量并显示在屏幕上。

问题::我想对显示的所有输出值应用该过滤器(而不必再次调用该过滤器函数)。

当前,我正在为每个输出变量使用与我的过滤器相同的函数作为该函数的参数。这似乎是浪费计算,因为我真的只需要调用一次函数,使用所有这些数据来填充我的所有输出值。

我觉得这里缺少基本的东西。

理想情况下,我希望能够这样调用(返回包含小标题和其他一些计算值的列表):

test <- reactive({se_report_filtered(my_filter = input$PM_ID, 
                                          start_year = input$obs[1], 
                                          end_year = input$obs[2])})

se_report_filtered 是一个实际上为我计算新值并返回列表的函数。

然后使用 test 填充所有其他输出值。我似乎无法正常工作。相反,我为每个输出调用了 se_report_filtered 。这似乎是错误的方法。

这不是完全可复制的代码段,但我希望这个想法仍然存在。

library(shiny)
library(shinydashboard)

header <- dashboardHeader(title = "Home")

frow1 <- fluidRow(
  valueBoxOutput("value2"), 
)


body <- dashboardBody(frow1)

#completing the ui part with dashboardPage
ui <- dashboardPage(title = 'Review', header, sidebar, body, skin='red')


server <- function(input, output) {

output$value2 <- renderValueBox({ 
    valueBox(
      formatC(se_report_filtered(my_filter = input$PM_ID, 
                                 start_year = input$obs[1], 
                                 end_year = input$obs[2])[[2]], 
              format="d", big.mark=',')
      ,'Total Met'
      ,icon = icon("stats",lib='glyphicon')
      ,color = "green")  
  })
}

shinyApp(ui, server)

因此,从本质上讲,我想替换:

output$value2 <- renderValueBox({ 
        valueBox(
          formatC(se_report_filtered(my_filter = input$PM_ID, 
                                     start_year = input$obs[1], 
                                     end_year = input$obs[2])[[2]], 
                  format="d", big.mark=',')
          ,'Total Met'
          ,icon = icon("stats",lib='glyphicon')
          ,color = "green")  
      })

使用

output$value2 <- renderValueBox({ 
        valueBox(
          formatC(test[[2]], 
                  format="d", big.mark=',')
          ,'Total Met'
          ,icon = icon("stats",lib='glyphicon')
          ,color = "green")  
      })

我认为我在处理反应变量时缺少一些基本知识。

1 个答案:

答案 0 :(得分:0)

同样,我不确定您的功能是什么,因此我创建了一个反应式列表,第四个元素是滑块的输入。当我调用反应变量时,我先将其分配给常规变量,然后再设置第四个变量。这些都是在render函数中完成的。

library(shiny)
library(shinydashboard)

ui  <- fluidPage(
  fluidRow(
    valueBoxOutput("value2"),
    sliderInput("slider","Fourth Element", 1, 10, 5)
  ))

server <- function(input, output, session) { 

  test<-reactive(list(1,2,3,input$slider))

  output$value2 <- renderValueBox({ 
    Test<-test()
    Test<-Test[4]
    valueBox(
      formatC(Test, 
              format="d", big.mark=',')
      ,'Total Met'
      ,icon = icon("stats",lib='glyphicon')
      ,color = "green")  
  })



}


shinyApp(ui = ui, server = server)

由于render函数是一个反应性环境,因此它对反应性变量(在这种情况下为test())中的更改做出响应。

在您的情况下,test()返回在se_report_filtered内部创建的任何内容,它可以以相同的方式成为子集。