我无法在Shiny应用程序中使用Crosstalk包中的功能。运行时,我收到一条错误消息,提示未找到我的SharedData对象。
我想创建一个Shiny应用程序,用户可以用各种方式进行过滤(selectInput,选择数据表中的行等),但是所有表,图表和地图都会同时更新,而与过滤方法无关。我听说串扰对此有好处,并且我以火山示例here作为模板。
我的问题是,当我尝试运行我的应用程序时,收到一条警告,提示找不到SharedData对象。我尝试将其放置在服务器部分,并尝试将其放置在反应式,eventReactive,observe,observeEvent等中,但是这些没有任何区别。我还尝试将代码放置在ui和服务器部分之外,但是唯一的区别是我的错误是“环境类型的对象不可子集化”。
以下不是我的原始代码;我通过共享以下内容简化了问题并使其可重现: *从Rstudio创建了一个新的Shiny应用程序(模板使用了忠实的数据集) *将数据集从忠实修改为虹膜 *添加了对串扰库的调用 *包含filter_select,SharedData调用 *修改了第48行以引用shared_df而不是虹膜
library(shiny)
library(crosstalk)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Crosstalk test"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30),
filter_select("rows", "Select rows:",
shared_df,
~Species,
multiple = TRUE)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
# Shared data available for use by the crosstalk package
shared_df <- SharedData$new(iris)
output$distPlot <- renderPlot({
# generate bins based on input$bins from ui.R
x <- shared_df[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
# draw the histogram with the specified number of bins
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
}
# Run the application
shinyApp(ui = ui, server = server)
我的预期结果应包括带有交互式滑块的直方图,以动态调整箱宽度(按照“旧的,忠实的”模板)。另外,我应该能够选择植物种类,并且直方图应该动态更新以仅显示所选种类的结果。
*编辑* 我设法为一个闪亮的应用程序重新创建了上面链接的火山示例。下面的代码有效:
library(shiny)
library(crosstalk)
library(leaflet)
library(DT)
# Wrap data frame in SharedData
# Use SharedData like a dataframe with Crosstalk-enabled widgets
sd <- SharedData$new(quakes[sample(nrow(quakes), 100),])
ui <- fluidPage(
# Create a filter input
filter_slider("mag", "Magnitude", sd, column=~mag, step=0.1, width=250),
bscols(leafletOutput("map"), DTOutput("table"))
)
server <- function(input,output) {
output$map <- renderLeaflet({ leaflet(sd) %>% addTiles() %>% addMarkers()})
output$table <- renderDT({
datatable(sd, extensions="Scroller", style="bootstrap", class="compact", width="100%",
options=list(deferRender=TRUE, scrollY=300, scroller=TRUE))
}, server = FALSE)
}
shinyApp(ui = ui, server = server)
此火山示例与我的虹膜示例之间的唯一区别是(除了将shared_df移动到ui和服务器之外),还使用了filter_select。当我移动shared_df时,将返回另一个错误:“警告:[:类型为'environment'的对象中的错误不可子集化”