【问题标题】:In shiny, selecting unique values from a column in a reactive object to use as input choices在闪亮中,从反应对象的列中选择唯一值以用作输入选择
【发布时间】:2020-08-11 08:28:55
【问题描述】:

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

目前我的代码如下所示:


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()
      })

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

相反,我得到了这个错误:

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

我对使用 Shiny 很陌生,所以在解决这个问题时遇到了真正的问题。 任何帮助将不胜感激

【问题讨论】:

  • 尝试在您的updatePickerInput 语句(updatePickerInput(session, 'to', choices = choices()))中添加session,并确保session 在您的服务器函数中:server &lt;- function(session, input, output)
  • @Ben 太棒了,谢谢
  • @Ben 发帖回答一些神奇的互联网点
  • @hedgedandlevered 没问题 - 很高兴提供答案。

标签: r shiny


【解决方案1】:

这经常出现。您可能有一个可用的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

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 2020-08-01
    • 2017-11-24
    • 2018-10-09
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多