我希望每个会话中都有一个可以通过输入更新的局部变量,该变量可以被服务器中的所有其他功能使用。请参阅下面的简单示例,我希望在用户更改值时更新对象但不是?
library(shiny)
# Define UI for application
ui = shinyUI(pageWithSidebar(
# Application title
headerPanel("Hello Shiny!"),
# Sidebar with a slider input for data type
sidebarPanel(
selectInput("data",
"Pick letter to us in complex app?", choices = c("A","B"),
selected = "A")
),
# Print letter
mainPanel(
textOutput("Print")
)
))
server =shinyServer(function(input, output) {
MYLetter = "A";
updateData = reactive({
if (input$data == "A") {
MYLetter <<- "A"
} else {
MYLetter <<- "B"
}
})
output$Print <- renderText({
print(MYLetter)
})
})
shinyApp(ui, server)
我觉得解决方案将是全局变量,但如果两个人同时在应用程序上。一个人为全局变量分配新值是否会改变另一个用户的变量?
答案 0 :(得分:1)
您的代码存在一些问题。这是您想要的代码,我尝试对代码进行非常小的更改,以使其工作:
ui = shinyUI(pageWithSidebar(
# Application title
headerPanel("Hello Shiny!"),
# Sidebar with a slider input for data type
sidebarPanel(
selectInput("data",
"Pick letter to us in complex app?", choices = c("A","B"),
selected = "A")
),
# Print letter
mainPanel(
textOutput("Print")
)
))
server =shinyServer(function(input, output) {
MYLetter = reactiveVal("A");
observe({
if (input$data == "A") {
MYLetter("A")
} else {
MYLetter("B")
}
})
output$Print <- renderText({
print(MYLetter())
})
})
shinyApp(ui, server)
基本上这两个问题是:
您正在寻找的是使用reactiveVal()
或reactiveValues()
创建无效值。您完全正确地认为创建全局变量不是正确的解决方案,因为它将在所有用户之间共享。它也不是那种反应。
我将reactive({...})
更改为observe({...})
。了解被动者和观察者之间的区别非常重要。我建议在网上阅读它。我将其更改为观察,因为您没有返回正在使用的值 - 相反,您正在其中进行分配。