【发布时间】:2019-03-03 22:47:57
【问题描述】:
我想在 Shiny 中创建一个 reactiveValues 对象,其内容定义为输入小部件中包含的值。我设法做到了,但我的实现似乎不必要地笨拙:
- 创建一个空的
reactiveValues对象 - 当输入小部件的值随着
observeEvent变化时监控 - 使用来自输入小部件 (
isolate) 的非反应性值将值分配给reactiveValues对象
这是一个例子:
ui <- fluidPage(
fluidRow(
column(2, radioButtons("main", label = "Main dish", choices = list("salad", "pasta"))),
column(2, radioButtons("desert", label = "Desert", choices = list("fruit", "cake"))),
column(8, actionButton("extra", "Louder!", style="background-color: #ffdb99"))
),
verbatimTextOutput("myorder")
)
server <- function(input, output, session) {
# 1. Create reactiveValues object
menuR <- reactiveValues()
# 2. Update values whenever widgets change
observeEvent(c(input$main, input$desert),
menuR[["meal"]] <- paste(c(isolate(input$main), isolate(input$desert)), collapse = " & ")
)
# 3. Perform operations on object values
observeEvent(input$extra,
menuR[["meal"]] <- paste0(toupper(menuR[["meal"]]), "!!!")
)
output$myorder <- renderText(menuR[["meal"]])
}
shinyApp(ui, server)
我非常想像这样直接创建reactiveValues对象(大大简化了上面的代码):
# Set values upon creation
menuR <- reactiveValues(meal = paste(c(input$main, input$desert), collapse = " & "))
这不起作用,因为input$main 是被动的...
我猜想用从小部件获得的值定义 reactiveValues 对象将是一种常见的做法。
我错过了什么吗?
感谢您的帮助,
雨果
【问题讨论】:
-
为什么一定要使用
reactiveValue?在您的情况下,只需将input$main和input$desert放入renderText就可以了。 -
嗨,吉姆。我在现实世界的应用程序中的意图是让
reactiveValuesobject 成为一个数据框,其内容可以通过几个小部件的输入即时修改。文本示例是一种简化。
标签: r shiny shiny-reactivity