我正在尝试制作一个闪亮的仪表板应用程序,其中从反应式数据对象的列中检索下拉菜单中的可用选项。
此刻,我的代码如下:
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,因此在解决此问题时遇到了实际问题。 任何帮助将不胜感激
答案 0 :(得分:2)
这经常出现。您可能有一个shiny
方法有效的server
应用,该方法缺少一个session
参数。但是一旦使用了updatePickerInput
,updateSelectInput
,updateTextInput
等方法,就会遇到错误,因为它将要求您将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