输出函数之间的范围

时间:2016-04-19 10:34:54

标签: shiny

我已经完成了(希望足够彻底)有关范围的闪亮帮助article,并且还看到了关于设置global object here的答案。然而,两者都没有解决我的想法(强调“思考”)我需要做的事情。如果变量仅在输出函数中创建,是否可以在另一个变量中看到?使用动作按钮,我试图控制冗长的计算,有些只会在发生其他事情的情况下发生。作为一个最小的例子,

library(shiny)
library(stringr)

fruitref <- c("apple","peach","pear","plum","banana","kiwi")
textareaInput <- function(inputID, label, value="", rows=10, columns=30) {
  HTML(paste0('<div class="form-group shiny-input-container">
              <label for="', inputID, '">', label,'</label>
              <textarea id="', inputID, '" rows="', rows,'" cols="',
              columns,'">', value, '</textarea></div>'))
}
ui <- fluidPage(titlePanel("minimal example"),
        sidebarLayout(
          sidebarPanel(
            textareaInput("inputfruit", "Enter some fruits:"),
            actionButton("checkfruit", "Check fruits"),
            verbatimTextOutput("fruitstat")
          ),
          mainPanel(
            textOutput("fruits")
          )
        )
)
server <- function(input,output){
  flag <- F
  inputs <- eventReactive(input$checkfruit,{input$inputfruit})
  continue <- reactive(flag)
  output$fruitstat <- renderText({
    inputs <- inputs()
    inputs <- str_trim(unlist(strsplit(inputs,split="\n")),side="both")
    if(length(setdiff(inputs,fruitref)) != 0 | length(inputs) == 0){
      flag <- F
      paste(paste(setdiff(inputs,fruitref), collapse=", "),"not in table.")
    } else {
      flag <- T
      "All fruits ok."
    }
  })
  output$fruits <- renderText({
    paste("Continue? ",continue())

  })
}
shinyApp(ui = ui, server = server)

有一个参考表,并根据该表检查用户输入。用户输入列表,直到点击检查按钮,然后获得反馈是否一切正常,或者是否存在不匹配。只有一切都好的我才能继续。我尝试在输出函数中设置“继续”标志,但是这不起作用,并且在输出函数之外的服务器中设置它不会更新该值。我也尝试在服务器函数中创建一个环境并使用assign,但是当我稍后尝试为renderText检索它时​​,它也没有更新该值。由于它不是输入,可通过输入$访问,我想我不能使用任何更新*函数。

这可能不是设置此类条件的最佳方式。我在教程中看到了条件窗格,但这取决于输入,而不是函数中创建的内容。更一般地说,在输出函数中要创建更复杂的对象(最多会有四个大表和一个绘图;实际上会输出所有或某些子集)然后其他输出函数应该看到,我没想到我可以将它们定义为反应性全局对象,因为在以后的某些事情发生之前,它们无法计算。

1 个答案:

答案 0 :(得分:1)

continue定义为eventReactive

continue <- eventReactive(input$checkfruit, flag)

并且还使用函数内的全局赋值运算符

        flag <<- F
        flag <<- T

然后它会起作用。测试