r - R Shiny:使用 input$ 值创建 reactiveValues 对象
问题描述
我想reactiveValues
在 Shiny 中创建一个对象,其内容定义为输入小部件中包含的值。我设法做到了,但我的实现似乎不必要地笨拙:
- 创建一个空
reactiveValues
对象 - 监视输入小部件的值何时随
observeEvent
- 使用来自输入小部件 ( )
reactiveValues
的非反应性值为对象分配值isolate
这是一个例子:
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
用从小部件获得的值定义对象将是一件常见的事情。
我错过了什么吗?
谢谢你的帮助,
雨果
解决方案
您可以通过使用reactive()
代替来做到这一点reactiveValues()
。menuR
是一个依赖于 和 的输入值的反应main
对象desert
。定义后,您可以通过调用menu()
服务器代码来使用它。此外,这使您免于使用isolate()
,因为您可以将 的值设置menu
为内部的反应对象observeEvent()
。
library(shiny)
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) {
menuR <- reactive({
paste(c(input$main, input$desert), collapse = " & ")
})
observeEvent(
input$extra,
menuR <- reactive({
toupper(paste(c(input$main, input$desert), collapse = " & "))
})
)
output$myorder <- renderText(menuR())
}
shinyApp(ui, server)
编辑
我之前误解了这个问题。您可以使用eventReactive()
which 监视输入并在用户输入更改时更改。我还为用户尚未单击操作按钮时添加了默认值。
library(shiny)
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) {
# Set a 'default' value for the output
default.menuR <- reactive({
paste(c(input$main, input$desert), collapse = " & ")
})
menuR <- eventReactive(input$extra, {
toupper(paste(c(input$main, input$desert), collapse = " & "))
})
# Initial state of the button is 0, which displays 'default' value
output$myorder <- renderText({
if (input$extra == 0) {
return(default.menuR())
}
menuR()
})
}
shinyApp(ui, server)
希望这可以帮助!
推荐阅读
- javascript - 使用变量输入创建嵌套数组/对象的 Javascript 函数
- node.js - 使用 pdf2json 将 pdf 解析为 json 时出现 TypeError
- fullcalendar - Fullcalendar V4:如何将从 ajax 接收到的 json 解析为事件列表
- jquery - 如何处理网关 API 和 Lambda 代理的错误?
- c++ - 检索函数对象的可调用运算符的所有重载的参数类型
- java - spring boot项目可以不用互联网搭建开发吗?
- python - 如何在每年重置的python中生成带有年份和序列号的task_id?
- java - 检查 BT 是否是带有 T 扩展可比性的 BST
爪哇 - winapi - DialogBox 未正确绘制对话框
- c++ - 将函数转换为成员函数