基本 R 闪亮本地范围对象
Basic R shiny local scoping object
我想要在每个会话中有一个可以通过输入更新的局部变量,它可以被服务器中的所有其他函数使用。请参阅下面的简单示例,我希望在用户更改值时更新对象,但它没有?
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)
我觉得一个解决方案是全局变量,但如果两个人同时在应用程序上。一个人将新值分配给全局变量是否会更改另一个用户的变量?
您的代码有几个问题。这是您想要的代码,我尝试对您的代码进行非常小的更改以使其工作:
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({...})
。了解反应式和观察者之间的区别非常重要。我建议在线阅读它。我将其更改为观察,因为您没有返回正在使用的值 - 相反,您正在其中进行分配。
我想要在每个会话中有一个可以通过输入更新的局部变量,它可以被服务器中的所有其他函数使用。请参阅下面的简单示例,我希望在用户更改值时更新对象,但它没有?
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)
我觉得一个解决方案是全局变量,但如果两个人同时在应用程序上。一个人将新值分配给全局变量是否会更改另一个用户的变量?
您的代码有几个问题。这是您想要的代码,我尝试对您的代码进行非常小的更改以使其工作:
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({...})
。了解反应式和观察者之间的区别非常重要。我建议在线阅读它。我将其更改为观察,因为您没有返回正在使用的值 - 相反,您正在其中进行分配。