基本R闪亮的本地范围对象

时间:2018-03-08 06:12:17

标签: r shiny scoping

我希望每个会话中都有一个可以通过输入更新的局部变量,该变量可以被服务器中的所有其他功能使用。请参阅下面的简单示例,我希望在用户更改值时更新对象但不是?

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)

我觉得解决方案将是全局变量,但如果两个人同时在应用程序上。一个人为全局变量分配新值是否会改变另一个用户的变量?

1 个答案:

答案 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)

基本上这两个问题是:

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

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