R Shiny : Observe only works once

标签 r dynamic shiny reactive-programming observers

我正在为一个学校项目开发一个 R shiny 仪表板,但我对 react 值和观察者有疑问。 我想在用户成功登录时更新 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)
  })

我已经尝试了互联网上的几个教程,使用了 reactive、observe 等,但我无法弄清楚我的代码有什么问题,你们能帮帮我吗?

提前致谢 亚历克斯

最佳答案

您希望您的代码对 isConnected 的值使用react。我建议你让这个变量是局部的 - 而不是全局的 - 可以通过 makeReactiveBinding

将其标记为 react 值

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

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 的调用,因为它在您的代码示例中不正确。

关于R Shiny : Observe only works once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056230/

相关文章:

r - 使用 ggplot 显示 y 最大值的位置

r - 在 R 中推断顺序数据中的选择顺序

r - 当两个 df 中的 char col 都可以充当键时,使用另一个 df 中的列上的条件来更新 df col 值

c# - 动态 Linq select 语句

r - 有什么办法让R Shiny支持多用户吗?我说的是数百个并发用户

R Shiny 的 slider 增量

r - 在 rShiny 应用程序中使用markerClusterOptions() 时弹出传单

android - 在 Android 的对话框中获取从动态创建的 edittext 输入的整数值会抛出 NumberFormatException

c# - 动态加载类型的 SerializationException

r - 用因子 R 叠加 2 个线图