我已经完成了(希望足够彻底)有关范围的闪亮帮助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检索它时,它也没有更新该值。由于它不是输入,可通过输入$访问,我想我不能使用任何更新*函数。
这可能不是设置此类条件的最佳方式。我在教程中看到了条件窗格,但这取决于输入,而不是函数中创建的内容。更一般地说,在输出函数中要创建更复杂的对象(最多会有四个大表和一个绘图;实际上会输出所有或某些子集)然后其他输出函数应该看到,我没想到我可以将它们定义为反应性全局对象,因为在以后的某些事情发生之前,它们无法计算。
答案 0 :(得分:1)
将continue
定义为eventReactive
:
continue <- eventReactive(input$checkfruit, flag)
并且还使用函数内的全局赋值运算符
flag <<- F
flag <<- T
然后它会起作用。测试