2016-07-29 118 views
0

我横跨其中一个反应性表达式求值多次时,它调用renderUI窗口小部件内的一些输入的情况来的重复评估。ř闪亮,反应性表达

请检查以下简单代码。

library(shiny) 


server <- function(input, output) { 
    output$INPUT_1 = renderUI({ 
    selectInput("input_1","Input 1",choices = letters) 
    }) 
    output$INPUT_2 = renderUI({ 
    selectInput("input_2","Input 2",choices = letters) 
    }) 
    output$INPUT_3 = renderUI({ 
    selectInput("input_3","Input 3",choices = letters)  
    }) 
    output$INPUT_4 = renderUI({ 
    selectInput("input_4","Input 4",choices = letters)  
    }) 


    output$text = renderText({ 
    print("1") 
    paste(input$input_1,input$input_2,input$input_3,input$input_4) 
    }) 

} 

ui <- fluidPage(
    uiOutput("INPUT_1"), 
    uiOutput("INPUT_2"), 
    uiOutput("INPUT_3"), 
    uiOutput("INPUT_4"), 
    textOutput("text") 
) 

shinyApp(ui = ui, server = server) 

如果你看看你的控制台,你会看到

Listening on http://127.0.0.1:4939 
[1] "1" 
[1] "1" 

的 “1” 来过两次。

自己的应用程序具有“1”来了3倍以上。由于我对每个大数据的反应性交易,这种情况真的让我的用户和我感到尴尬。

我几乎可以肯定这事跟renderUI设施。但我仍然无法找到解决的办法。我考虑使用updateXXXXX功能,但我的输入UI包含非常复杂的计算。所以使用updateXXXXX是我试图避免的。

如何能在我的反应表现只能计算一次?

+0

每次(链接的)ui元素发生变化时,都会评估一个反应表达式。因此,服务器在应用程序加载并且所有输入都为空时进行评估。比被反应的UI元素被填充并且您的打印被第二次评估。 (添加如果(长度(输入$ input_1)> 0)打印(“1”)到输出$文本为例) – Arcoutte

回答

1

闪亮附带一个名为req一个额外的功能,可以帮助您控制即使一些控制元件在某些服务器片面调用内飞渲染观察员执行。

this page here的完整文档。简而言之,您可以在反应环境(观察者,反应值或渲染函数)中列出一组输入变量,并且在所有输入变量都有一个赋值后才会计算/执行该反应环境。

在你的情况,你可以添加一行

req(input$input_1, input$input_2,input$input_3, input$input_4) 

你的观察,它只会被执行一次。 (由于Arcoutte对你的帖子的评论中陈述的原因被执行了两次。)

完整的示例代码如下。

library(shiny) 

server <- function(input, output) { 
    output$INPUT_1 = renderUI({ 
    selectInput("input_1","Input 1",choices = letters) 
    }) 
    output$INPUT_2 = renderUI({ 
    selectInput("input_2","Input 2",choices = letters) 
    }) 
    output$INPUT_3 = renderUI({ 
    selectInput("input_3","Input 3",choices = letters)  
    }) 
    output$INPUT_4 = renderUI({ 
    selectInput("input_4","Input 4",choices = letters)  
    }) 


    output$text = renderText({ 
    req(input$input_1,input$input_2,input$input_3,input$input_4) 

    print("1") 
    paste(input$input_1,input$input_2,input$input_3,input$input_4) 
    }) 

} 

ui <- fluidPage(
    uiOutput("INPUT_1"), 
    uiOutput("INPUT_2"), 
    uiOutput("INPUT_3"), 
    uiOutput("INPUT_4"), 
    textOutput("text") 
) 

shinyApp(ui = ui, server = server) 
+0

谢谢。这完全解决了我的问题。 – John