【问题标题】:R Shiny : Observe only works onceR Shiny:观察只有效一次
【发布时间】:2016-07-03 13:06:21
【问题描述】:

我正在为一个学校项目开发一个闪亮的 R 仪表板,但我对反应值和观察者有疑问。 我想在用户成功登录时更新 UI(更准确地说是 selectInput)。

这是我当前的代码

global.R

db <<- dbConnect(SQLite(), dbname = "ahp_data.db")
isConnected <<- 0

#Imagine here that df will contain the model names
df <- data.frame(option1 =c("No model selected),
                 option2 =c("model_1","model_2")
     )

reactValues <<- reactiveValues()
isConnectVar <- NULL

ui.R

library(shinydashboard)

dashboardPage( 
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(

#Authentification Panel
sidebarLayout(
  sidebarPanel(
        titlePanel("Authentification"),
        textInput('username', label="User name"),
        passwordInput('password', label= "password"),
        actionButton("connectButton", label='Connect'),
        actionButton("subscribeButton",label='Subscribe'),
        actionButton("logoutButton", label="Log out")
   ),
  sidebarPanel(
        #Input to update when logged in
        selectInput("selectModelInput", label="Model   selection",choices=list("No model selected")),
        actionButton("newModelButton",label="New model"),
        actionButton("renameModelButton", label="Rename model"),
        actionButton("duplicateModelButton",label="Duplicate model"),
        actionButton("loadModelButton", label='Load model'),
        actionButton("deleteModelButton", label='Delete model')
  )
 )

server.R

connect <- function(userName,pwd){
  isConnected <<- 0;
  qry = paste0("SELECT password from USER where pseudo = \'",userName,"\'")
  res= dbGetQuery(db,qry )
  res = paste0(res)
  if(res==pwd)
  {
    isConnected <<- 1;
    print("CONNECTED")

  }
  else{
    print("unable to connect to the database")
  }

function(input, output, session) {
  isConnectedVar <- reactive({
    isConnected+1
  })

  #Authentification Panel dynamic UI
  observe({
    if(isConnected== 0){
     reactValues$selector <<- updateSelectInput(session,"selectModelInput", label="Model selection", choices = as.character(df[[paste0(option,isConnectedVar())]]))
    }
    else{
      reactValues$selector <<- updateSelectInput(session,"selectModelInput",  label="Model selection", choices = as.character(df[[paste0(option,isConnectedVar())]]))
    }
  })

 observeEvent(input$connectButton, {
    userName= paste0(input$username)
    userPwd = paste0(input$password)
    connect(user = userName,pwd = userPwd)
  })

我在互联网上尝试了几个教程,使用响应式、观察等,但我无法弄清楚我的代码有什么问题,你们能帮帮我吗?

提前致谢 亚历克斯

【问题讨论】:

    标签: r dynamic shiny reactive-programming observers


    【解决方案1】:

    您希望您的代码对isConnected 的值作出反应。我建议你让这个变量是本地的 - 而不是全局的 - 可以通过makeReactiveBinding 将其标记为反应值

    这是我的建议(在单文件应用中):

    library(shiny)
    library(shinydashboard)
    
    df <- data.frame(option1 =c("No model selected"),
                     option2 =c("model_1","model_2")
    )
    
    runApp(
      shinyApp(
        ui = shinyUI(
          dashboardPage(
            dashboardHeader(),
            dashboardSidebar(),
            dashboardBody(
    
            #Authentification Panel
            sidebarLayout(
              sidebarPanel(
                titlePanel("Authentification"),
                textInput('username', label="User name"),
                passwordInput('password', label= "password"),
                actionButton("connectButton", label='Connect'),
                actionButton("subscribeButton",label='Subscribe'),
                actionButton("logoutButton", label="Log out")
              ),
              sidebarPanel(
                #Input to update when logged in
                selectInput("selectModelInput", label="Model   selection",choices=list("No model selected")),
                actionButton("newModelButton",label="New model"),
                actionButton("renameModelButton", label="Rename model"),
                actionButton("duplicateModelButton",label="Duplicate model"),
                actionButton("loadModelButton", label='Load model'),
                actionButton("deleteModelButton", label='Delete model')
              )
            )
          )
          )
        ),
    
        server = function(input, output, session) {
    
          # function inside such that it has the scope of the server
          connect <- function(userName,pwd){
            isConnected <<- 0;
            qry = paste0("SELECT password from USER where pseudo = \'",userName,"\'")
            res= "12345"
            res = paste0(res)
            if(res==pwd)
            {
              isConnected <<- 1;
              print("CONNECTED")
    
            }
            else{
              print("unable to connect to the database")
            }
          }
    
          # set this as per-instance variable and make it reactive
          isConnected <- 0
          makeReactiveBinding("isConnected")
    
          # now this fires whenever isConnected changes
          isConnectedVar <- reactive({
            isConnected+1
          })
    
          #Authentification Panel dynamic UI
          observe({
            if(isConnected== 0){
              updateSelectInput(session,"selectModelInput", label="Model selection", choices = as.character(df[[paste0("option",isConnectedVar())]]))
            }
            else{
              updateSelectInput(session,"selectModelInput",  label="Model selection", choices = as.character(df[[paste0("option",isConnectedVar())]]))
            }
          })
    
          observeEvent(input$connectButton, {
            userName= paste0(input$username)
            userPwd = paste0(input$password)
            connect(user = userName,pwd = userPwd)
          })
        }
      )
    )
    

    注意:我编辑了对 df 的调用,因为它在您的代码示例中不正确。

    【讨论】:

    • 有效!非常感谢罗德先生 :) 我认为问题出在我在函数服务器(输入,输出,会话)之外声明连接函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2021-05-30
    相关资源
    最近更新 更多