R Shiny,监控变量并更新 ui
R Shiny, monitoring a variable and updating ui
我正在尝试在一个闪亮的应用程序中创建一个消息系统,当某些任务完成时它会收到通知,但目前它不起作用:
UI:
library(shinydashboard)
dashboardPage(
dashboardHeader(title = "My Dashboard",
dropdownMenuOutput("messageMenu")
),
dashboardSidebar(),
dashboardBody("Hi", actionButton("go", label="DO STUFF!"), actionButton("go2", label="DO MORE STUFF!"))
)
服务器:
library(shinydashboard)
shinyServer(function(input, output) {
M_Store <- reactiveValues(DF = data.frame(
from = c("Admininstrator", "New User", "Support"),
message = c(
"Sales are steady this month.",
"How do I register?",
"The new server is ready."
),
stringsAsFactors = FALSE
))
output$messageMenu <- renderMenu({
msgs <- apply(M_Store$DF, 1, function(row) {
messageItem(from = row[["from"]], message = row[["message"]])
})
dropdownMenu(type = "messages", .list = msgs)
})
reactive({
input$go
message("Button pressed. Execute analysis!")
message("Pretend analysis got done!")
message("Now want to send a message that the analysis is done!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Meee", message="Done message!"))
})
reactive({
input$go2
message("Second button pressed. Execute second analysis!")
message("Some computation!")
message("Want to update the user on progress with a message!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Someone else!", message="Progress message2!"))
message("More computations....")
message("Done, want to tell user I'm done!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Someone else!", message="Done message2!"))
})
})
你看出我的意图了吗?我希望能够推送分析或行动进展的消息。我认为在 M_Store 中有一个反应性 DF 意味着只要它被操纵,那么依赖于它的任何东西也是如此,即 output$messageMenu.
我想做的类似于 shiny 的进度条:当你进行计算时,你只需更新它们的变量,它们就会在屏幕上发生变化。
谢谢,
本.
您可以将 reactiveValues
函数与 isolate
结合使用。你的案例看起来像:
messageData <- data.frame(from = character(0), message = character(0), stringsAsFactors = F) #simplified this a bit
shinyServer(function(input, output) {
M_Store <- reactiveValues(DF = messageData)
newMessage <- reactive(data.frame(from = as.character(input$from),message = as.character(input$message)))
observe({
M_Store$DF <- rbind(isolate(M_Store$DF), newMessage())
})
output$myUI <- renderUI({
#some code
... M_Store$DF ...
#some code
})
})
M_Store$DF
现在是一个反应值。当 或 input$from
或 input$message
改变时
, newMessage
会改变,这又会 rbind
一个新行。如果 M_Store
在任何 renderUI
函数中,它将将该值更新为 wll.
如果我明白你正在尝试做什么,你可能想将 newMessage 更改为 eventReactive
,这样用户需要按下一个按钮来提交任何更改(相对于它每次都会触发输入更改)。
编辑:
根据您上面的编辑,您需要以下内容而不是反应函数:
observeEvent(input$go,{
message("Button pressed. Execute analysis!")
message("Pretend analysis got done!")
message("Now want to send a message that the analysis is done!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Meee", message="Done message!"))
})
每次 input$go
的值改变时(每次按下按钮时)都会触发。如果您在此处放置其他输入或反应值,则可以将其绑定到其他进程或 ui 元素
我正在尝试在一个闪亮的应用程序中创建一个消息系统,当某些任务完成时它会收到通知,但目前它不起作用:
UI:
library(shinydashboard)
dashboardPage(
dashboardHeader(title = "My Dashboard",
dropdownMenuOutput("messageMenu")
),
dashboardSidebar(),
dashboardBody("Hi", actionButton("go", label="DO STUFF!"), actionButton("go2", label="DO MORE STUFF!"))
)
服务器:
library(shinydashboard)
shinyServer(function(input, output) {
M_Store <- reactiveValues(DF = data.frame(
from = c("Admininstrator", "New User", "Support"),
message = c(
"Sales are steady this month.",
"How do I register?",
"The new server is ready."
),
stringsAsFactors = FALSE
))
output$messageMenu <- renderMenu({
msgs <- apply(M_Store$DF, 1, function(row) {
messageItem(from = row[["from"]], message = row[["message"]])
})
dropdownMenu(type = "messages", .list = msgs)
})
reactive({
input$go
message("Button pressed. Execute analysis!")
message("Pretend analysis got done!")
message("Now want to send a message that the analysis is done!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Meee", message="Done message!"))
})
reactive({
input$go2
message("Second button pressed. Execute second analysis!")
message("Some computation!")
message("Want to update the user on progress with a message!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Someone else!", message="Progress message2!"))
message("More computations....")
message("Done, want to tell user I'm done!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Someone else!", message="Done message2!"))
})
})
你看出我的意图了吗?我希望能够推送分析或行动进展的消息。我认为在 M_Store 中有一个反应性 DF 意味着只要它被操纵,那么依赖于它的任何东西也是如此,即 output$messageMenu.
我想做的类似于 shiny 的进度条:当你进行计算时,你只需更新它们的变量,它们就会在屏幕上发生变化。
谢谢, 本.
您可以将 reactiveValues
函数与 isolate
结合使用。你的案例看起来像:
messageData <- data.frame(from = character(0), message = character(0), stringsAsFactors = F) #simplified this a bit
shinyServer(function(input, output) {
M_Store <- reactiveValues(DF = messageData)
newMessage <- reactive(data.frame(from = as.character(input$from),message = as.character(input$message)))
observe({
M_Store$DF <- rbind(isolate(M_Store$DF), newMessage())
})
output$myUI <- renderUI({
#some code
... M_Store$DF ...
#some code
})
})
M_Store$DF
现在是一个反应值。当 或 input$from
或 input$message
改变时
, newMessage
会改变,这又会 rbind
一个新行。如果 M_Store
在任何 renderUI
函数中,它将将该值更新为 wll.
如果我明白你正在尝试做什么,你可能想将 newMessage 更改为 eventReactive
,这样用户需要按下一个按钮来提交任何更改(相对于它每次都会触发输入更改)。
编辑:
根据您上面的编辑,您需要以下内容而不是反应函数:
observeEvent(input$go,{
message("Button pressed. Execute analysis!")
message("Pretend analysis got done!")
message("Now want to send a message that the analysis is done!")
M_Store$DF <- rbind(isolate(M_Store$DF), data.frame(from="Meee", message="Done message!"))
})
每次 input$go
的值改变时(每次按下按钮时)都会触发。如果您在此处放置其他输入或反应值,则可以将其绑定到其他进程或 ui 元素