【问题标题】:render image from disk in R markdown / Dashboard on user selection dropdown在用户选择下拉列表中的 R markdown / Dashboard 中从磁盘渲染图像
【发布时间】:2025-11-30 15:40:01
【问题描述】:

我有一个包含上一步生成的图表的文件夹。它们都是PNG文件。 我希望能够选择使用 Flexdashboard 的任何人并加载它。 由于不需要闪亮或服务器服务,我尝试了 Crosstalk 包

library(crosstalk)
library(magrittr)
library(png)
    
df <- list.files("plots/", full.names = TRUE) %>%
      as_tibble() %>%
      magrittr::set_names("path") 
    
    shared_data <- SharedData$new(df,  key = ~path)
    
    p <- shared_data %>% readPNG(source = path)
    
    bscols( filter_select(id = "file_id", 
                         label = "CHOOSE", 
                         sharedData = shared_data, 
                         group = ~path), 
           p)

我遇到了一个非常简单的错误,我无法解决,因为所有路径都是从文件中正确读取的:

Error in path.expand(source) : invalid 'path' argument

也尝试过使用knitr:

   bscols(filter_select("path", "CHOOSE", shared_data),
      knitr::include_graphics(shared_data, ~path))

Error in makeGroupOptions(sharedData, group, allLevels) : argument "group" is missing, with no default

也许有一种更简单的方法,但串扰似乎是一种非常简单的方法,因为它不需要闪亮或任何其他组件,只需要一个数据框。

【问题讨论】:

    标签: r shiny flexdashboard crosstalk


    【解决方案1】:

    使用bsselectR 可以更轻松地实现这一点 该图书馆已有 5 年历史,但在我的试用中运行良好。它没有提供与crosstalk 相同级别的情节内交互,但可能足以满足当前目的。

    下面是添加到 R Markdown 文档的代码 sn-p。我已更改示例代码以允许递归目录遍历。 plots目录需要和R文件放在同一目录下。

    ```{r}
    # 
    library(stringr)
    library(bsselectR)
    
    state_plots <- paste0(list.files("plots", full.names = TRUE, recursive = TRUE))
    names(state_plots) <- str_replace_all(state_plots, 
                                          c("\\.png" = "", 
                                            "plots/" = ""))
    
    
    bsselect(state_plots, type = "img", selected = "sns_heatmap", 
             live_search = TRUE, show_tick = TRUE)
    
    
    ```
    

    输出:

    【讨论】:

    • 选择预选图片以外的图片时会失败。它只在负载下工作。
    • 让我检查一下(明天)。我记得尝试了动态下拉列表中的所有图像。
    最近更新 更多