如何使用Shiny中的串扰过滤反应性数据表?

时间:2019-01-24 10:25:13

标签: r shiny

我无法在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'的对象中的错误不可子集化”

0 个答案:

没有答案