如何使用Shiny中的Crosstalk来过滤反应数据表?

RDa*_*vey 7 r shiny

我无法在 Shiny 应用程序中使用 Crosstalk 包中的函数。运行时,我收到一条错误消息,指出找不到我的 SharedData 对象。

我想创建一个闪亮的应用程序,用户可以通过多种方式进行过滤(selectInput、选择数据表中的行等),但无论过滤方法如何,所有表格、图表和地图都会同时更新。我听说串扰对此有好处,并且我依赖此处的火山示例作为模板。

我的问题是,当我尝试运行我的应用程序时,我收到一条警告,指出找不到 SharedData 对象。我尝试将其放在服务器部分,并尝试将其放在reactive、eventReactive、observe、observeEvent等中,但这些没有任何区别。我还尝试将代码放置在用户界面和服务器部分之外,但唯一的区别是我的错误现在是“‘环境’类型的对象不可子集化”。

以下不是我的原始代码;我通过共享以下内容简化了问题并使其可重现:*从 Rstudio 创建了一个新的 Shiny 应用程序(模板使用忠实数据集)*将数据集从忠实数据集修改为 iris *添加了对串扰库的调用*包括 filter_select, SharedData 调用 *修改第 48 行以引用共享_df 而不是 iris

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)
Run Code Online (Sandbox Code Playgroud)

我的预期结果应包括带有交互式滑块的直方图,以动态调整箱宽度(按照“老忠实”模板)。此外,我应该能够选择植物物种,并且直方图应动态更新以仅显示所选物种的结果。

* 编辑 * 我已经成功地为 Shiny 应用程序重新创建了上面链接的火山示例。下面的代码有效:

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)

Run Code Online (Sandbox Code Playgroud)

这个火山示例和我的 iris 示例之间的唯一区别是(除了将 share_df 移到 ui 和服务器之外)filter_select 的使用。当我移动shared_df时,返回不同的错误:“警告:[中的错误:‘环境’类型的对象不可子集化”