闪亮时,从反应对象的列中选择唯一值以用作输入选择

时间:2019-10-03 14:15:43

标签: r shiny

我正在尝试制作一个闪亮的仪表板应用程序,其中从反应式数据对象的列中检索下拉菜单中的可用选项。

此刻,我的代码如下:


library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(tidyverse)

data <- reactiveFileReader(
  intervalMillis = 100000,  
  NULL,
  filePath = 'Data\\data.csv',
  readFunc = read.csv,
  fileEncoding="UTF-8-BOM"
)

header <- dashboardHeader(title = "test")

sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("plots", tabName = "plots"),
    pickerInput('to','To:',
                options = list(`actions-box` = TRUE, size = 10), multiple = TRUE,
                choices = NULL)
    )
  )

fluid1 <- fluidRow(
  box()
)

body <- dashboardBody(
  tabItems(
    tabItem(
      tabName = 'plots', h2(fluid1)
    )
  )
)

ui <- dashboardPage(title = 'test', header, sidebar, body, skin='blue')

server <- function(input, output){

  choices <- reactive({
    data() %>%
      select(to) %>%
      unique()
      })

  observe({updatePickerInput('to',choices = choices())})
}

shinyApp(ui = ui, server = server)

以及一些示例数据:

data <- data.frame(from = c('RCD', 'RCD', 'RCR', 'RCD', 'RCS', 'RCR', 'RCR', 'RCS', 'RCO', 'RCS'), 
                   to = c('RCS', 'RCR', 'RCO', 'RCO', 'RCR', 'RCD', 'RCS', 'RCD', 'RCR', 'RCO'),
                   n = c(1,2,3,4,5,6,7,8,9,10))

我期望的是-

choices <- reactive({
    data() %>%
      select(to) %>%
      unique()
      })

为我提供to反应对象的data()列中的唯一值列表,然后可以将其传递给observe({updatePickerInput('to',choices = choices())})

相反,我收到此错误:

Warning: Error in : $ operator is invalid for atomic vectors

我刚开始使用Shiny,因此在解决此问题时遇到了实际问题。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

这经常出现。您可能有一个shiny方法有效的server应用,该方法缺少一个session参数。但是一旦使用了updatePickerInputupdateSelectInputupdateTextInput等方法,就会遇到错误,因为它将要求您将session传递给它。因此,您需要确保在session函数中加入server参数:

server <- function(session, input, output) {
  ...
}

session对象在许多情况下都可以提供帮助,例如在关闭浏览器时执行某些操作,自定义用户界面,更新输入或将消息发送到javascript。有关更多信息,请参见此practical answer

对于updatePickerInput,您实际上是在向会话的客户端网页上的选择器输入发送消息。如果存在输入,则将调用绑定对象的receiveMessage方法。 updatePickerInput是一个友好的包装器,而不是通用的sendInputMessage。在这种情况下,请尝试包含session

updatePickerInput(session, 'to', choices = choices())

关于session对象的有用参考:

https://shiny.rstudio.com/reference/shiny/latest/session.html