我无法在 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时,返回不同的错误:“警告:[中的错误:‘环境’类型的对象不可子集化”
| 归档时间: |
|
| 查看次数: |
3389 次 |
| 最近记录: |