R 用 updateSelectInput 反应闪亮

Posted

技术标签:

【中文标题】R 用 updateSelectInput 反应闪亮【英文标题】:R reactive shiny with an updateSelectInput 【发布时间】:2019-02-15 03:38:44 【问题描述】:

我在闪亮上做了一个 updateSelectInput,它正在工作。但是在我不能将新输入用作输出的变量之后......输入始终为空。我给你 Ui.R 中 SelectInput 的代码和 server.R 中的更新。我不能提供更多,因为更新是通过访问数据库进行的。如果我仅为示例创建 data.frame,它将起作用...

selectInput("indic","Indicateur :",
                                    choices = NULL,selected = NULL),

observeEvent(input$Source,
          indicateurs<-as.character(voila_source(input$Source)$Indice)


          updateSelectInput(session,"indic",
                            choices = indicateurs)
     )

output$summary<-renderTable(     
          information<-voila_source(input$Source)
          information<-information[,-1]
          indica<-input$indic   ##here is empty...
          print(indica)
          description<-filter(information,Indice==indica)
          description
     )

也许我忘记了什么,我不知道。我想选择一个输入并打印一个与所选输入对应的data.frame。

编辑:找到答案

好的,我的代码和您的代码工作...它必须按下提交按钮...但我不想为此按下提交按钮,我只想单击 selectInput 打印我的输出,即selectInput 的描述,如果我想要这个,我按下按钮来显示一个图表。

我发现了错误,提交按钮,我将其替换为操作按钮,它正在工作......我不知道提交按钮和操作按钮。

如果它可以帮助你,这是我调用访问数据库和所有 server.R 代码和 ui.R 代码的代码:

    library(shiny)
    library(anytime)
    library(plotly)
    library(ggplot2)
    library(dplyr)
    library(RODBC)
    library(ecb)


    channel<-odbcConnectAccess("H:\\Analyse Macro\\Base Macro live.mdb")
    listee<-sqlQuery(channel,paste("Select * from Liste_source"))
    liste_server<-list()
    for (i in 1:length(listee$Table))
         liste_server[i]<-as.character(listee$Table[i])
    
    names(liste_server)<-as.character(listee$Table)

    for (i in 1:length(listee$Table))
         liste_server[[i]]<-sqlQuery(channel,paste("Select * from ",liste_server[i]))
    

    voila_source<-function(selection)
         x<-as.character(selection)
         liste_donnee<-liste_server[[x]]
         #liste_donnee<-as.character(liste_donnee$Indice)
         liste_donnee$Indice<-as.character(liste_donnee$Indice)
         liste_donnee$Description<-as.character(liste_donnee$Description)
         liste_donnee$Unite<-as.character(liste_donnee$Unite)
         liste_donnee$Frequence<-as.character(liste_donnee$Frequence)
         liste_donnee$Code<-as.character(liste_donnee$Code)
         liste_donnee$Pays<-as.character(liste_donnee$Pays)

         liste_donnee
    



    # Define server logic required to draw a histogram
    shinyServer(function(input, output,session) 




         observeEvent(input$Source,
              indicateurs<-as.character(voila_source(input$Source)$Indice)


              updateSelectInput(session,"indic",
                                choices = indicateurs)
         )


         output$summary<-renderTable(     
              information<-voila_source(input$Source)
              information<-information[,-1]
              reactives$indica<-input$indic
              print(reactives$indica)

              description<-filter(information,Indice==reactives$indica)
              description<-data.frame(test=indica)
              description
         )

    )


ui.R

    library(shiny)
    #library(quantmod)
    library(lubridate)
    library(plotly)
    library(ggplot2)
    library(RODBC)

    channel<-odbcConnectAccess("H:\\Analyse Macro\\Base Macro live.mdb")
    liste<-sqlQuery(channel,paste("Select * from Liste_source"))
    liste<-as.character(liste$Table)

    # Define UI for application that draws a histogram
    #shinyUI(fluidPage(
    ui<-tagList(
         navbarPage(
              "Evolutions Economiques",
              tabPanel("Observation",
                       # Application title
                       titlePanel("Evolutions Economiques"),

                       # Sidebar with a slider input for number of bins
                       #sidebarLayout(
                       sidebarPanel(
                            h1("Selection des donnees"),
                            selectInput("Source","Source :",
                                        choices =liste),
                            selectInput("indic","Indicateur :",
                                        choices = NULL,selected = NULL),
                            selectInput("pays","Pays :",
                                        choices = NULL),
                            selectInput("partenaire","Partenaire :",
                                        choices = NULL),
    #### replace by actionbutton submitButton("Ajouter"),
    actionButton("add","Ajouter"),
                            hr(),
                            img(src="logo.png",height=80,width=200),
                            br(),
                            br(),
                            helpText("Application realisee pour l'exploration des donnees macroeconomiques")
                       ),

                       # Show a plot of the generated distribution
                       mainPanel(
                            tabsetPanel(type="tabs",
                                        tabPanel("Description",tableOutput("summary"))
                                                 #,
                                        #plotlyOutput("graph"))
                       ))
              ),

              tabPanel("Extraction",
                       sidebarPanel(

                            selectizeInput("Index","Indice",c("ok")),
                            textInput("Nom","Nom fichier"),
                            actionButton("save","Sauver"),
                            hr(),
                            img(src="logo.png",height=80,width=200),
                            br(),
                            br(),
                            helpText("Application realisee pour l'exploration des donnees macroeconomiques")
                       ),

                       mainPanel(
                            tabsetPanel(type="tabs",
                                        tabPanel("liste",tableOutput("source")))
                       )


              ))
    )

【问题讨论】:

如果不能查看代码,我认为没有人能够最终解决您的问题。您确定数据库访问正常并且indicateurs 的值是您所期望的吗? 我把完整的代码放在下面。数据库访问工作正常,“indicateur”的值是我所期望的。当我启动应用程序时, SelectInput 不为空,所以我的 input$source 不为空,只是我的 input$indic 是它,因为我选择后没有输出......并且控制台上的 print() print "" 答案仅用于尝试回答问题。你应该edit你的问题通过点击标签下的edit按钮插入代码 【参考方案1】:

从您的示例来看,您似乎还没有初始化您的 indicateursindica 变量,对吗?

如果是这样,您将需要多行几行。您的解决方案(创建 data.frame)有效的原因是,当您测试您的应用程序时,该变量已经存在以供 observeEventrenderTable 函数执行。因此,只需在脚本中添加一些行,然后再调用它们即可。

这是一个使用 reactiveValues 的示例(使用闪亮的应用程序会更好):

selectInput("indic","Indicateur :",
                                    choices = NULL,selected = NULL),

# goes in your server.R
reactives <- reactiveValues(indicateurs = NULL, indica = NULL)
observeEvent(input$Source,
          reactives$indicateurs <-as.character(voila_source(input$Source)$Indice)


          updateSelectInput(session,"indic",
                            choices = reactives$indicateurs)
     )

output$summary<-renderTable(     
          information<-voila_source(input$Source)
          information<-information[,-1]
          reactives$indica<-input$indic   ##here is empty...
          print(reactives$indica)
          description<-filter(information,Indice==reactives$indica)
          description
     )

【讨论】:

感谢您的评论,但它不起作用... input$indic 仍然为空... 我不明白,我在应用程序中的 selectInput 不为空但输出为它... 好的,我的代码和你的代码工作...它必须按下操作按钮...但我不想为此按下操作按钮,我只想点击 selectInput打印我的输出,这是对 selectInput 的描述,如果我想要这个,我按下按钮来显示一个图表。 您的操作按钮输入未链接到示例代码中的任何内容。这是故意的吗?

以上是关于R 用 updateSelectInput 反应闪亮的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny:将多个连续的反应传递给 selectInput

观察事件中的R闪亮updateSelectInput不起作用

updateSelectInput 操作顺序/竞争条件

oracle11g安装闪退后没反应?

联想笔记本电脑开不了机,按开机键橙色灯会闪三下,连接电源没反应,下了电池也没反应

shinyURL 与 updateSelectInput 的交互