基本 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)

本质上这两个问题是:

  1. 您正在寻找的是使用 reactiveVal()reactiveValues() 创建反应值。创建全局变量不是正确的解决方案是绝对正确的,因为那样它将在所有用户之间共享。它也不是那样反应的。

  2. 我将 reactive({...}) 更改为 observe({...})。了解反应式和观察者之间的区别非常重要。我建议在线阅读它。我将其更改为观察,因为您没有返回正在使用的值 - 相反,您正在其中进行分配。