R:将多个图像添加到数据框/数据表中?

标签 r image shiny dt imageuri

我正在尝试将多个图像添加到 R 中的数据帧中,以在 R Shiny 中以 DT::dataTableOutput 的形式重现。

所需的输出如下所示:

<表类=“s-表”> <标题> 图标 食物 <正文> First 葡萄 Second 骨髓

我发现这个问题Adding an image to a datatable in R这允许我添加本地的图像,但前提是我输入路径,如下所示:


df <- read.csv("data.csv")

path = "/Users/name/Documents/remaining_path/"

df%<>%
  mutate(Icon = img_uri("/Users/name/Documents/remaining_path/grapes.png"))

但是我有数百张图像要添加,因此我希望获得稍微自动化一些的东西,如下所示:


df%<>%
  mutate(Image = paste(path, Food, ".png", sep = ""))%>%
  mutate(Icon = img_uri(Image))

这给了我这个错误

Error in `mutate()`:
! Problem while computing `Icon = img_uri(Image)`.
Caused by error in `file()`:
! invalid 'description' argument

我还尝试使用 for 循环创建一个向量:


for (i in df$Image) {
  
  Icon <- img_uri(i)
  
}

抛出此错误

Error in file(con, "rb") : cannot open the connection

9. file(con, "rb")
8. readBin(file, what, n, ...)
7. read_bin(x)
6. base64_encode(x)
5. paste0("data:", mime::guess_type(x), ";base64,", base64_encode(x))
4. xfun::base64_uri(f)
3. knitr::image_uri(x)
2. sprintf("<img src=\"%s\"/>", knitr::image_uri(x))
1. img_uri(i)

并应用:

Icon <- apply(X = df$Image, MARGIN = 1, FUN = img_uri())

这给出了这个错误

Error in knitr::image_uri(x) : argument "x" is missing, with no default

9. basename(file)
8. mime::guess_type(x)
7. paste0("data:", mime::guess_type(x), ";base64,", base64_encode(x))
6. xfun::base64_uri(f)
5. knitr::image_uri(x)
4. sprintf("<img src=\"%s\"/>", knitr::image_uri(x))
3. img_uri()
2. match.fun(FUN)
1. apply(X = df$Image, MARGIN = 1, FUN = img_uri())

非常感谢对此的任何意见。

最佳答案

我会这样做:

library(DT)
library(base64enc)

imgs <- c("img1.png", "img2.png")
b64imgs <- vapply(imgs, function(img){
  dataURI(mime = "image/png", file = img)
}, character(1L))
b64array <- paste0(
  c("[", sprintf("%s", toString(paste0("'", b64imgs, "'"))), "]"), 
  collapse = ""
)

render <- c(
  "function(data, type, row){",
  "  if(type === 'display'){",
  sprintf("var img = %s[data-1];", b64array),
  "    data = '<img src=\"' + img + '\"  width=100>';",
  "  }",
  "  return data;",
  "}"
)

dat <- data.frame(
  image = c(1, 2), 
  file = imgs
)

datatable(
  dat, 
  width = 500,
  options = list(
    columnDefs = list(
      list(targets = 1, render = JS(render)),
      list(targets = "_all", className = "dt-center")
    )
  )
)

enter image description here

关于R:将多个图像添加到数据框/数据表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72013790/

相关文章:

r - 从现有的、不足的数据帧在 R 中创建一个新的数据帧

r - 使用 R 将 JSON 字符串转换为 JSON 对象

r - 针对困惑的数据进行旋转

html - 内部带有 HTML 的 PHP for 循环无法正常运行

Android Spinner 使用带有 ID 的数组来处理图像资源

javascript - 使用 HTML 并排显示两个文档

r - Shiny 的observeEvent显示第一个事件,但不是第二个,第三个

r - 提高 R Shiny 传单 map 的速度

r - Shiny 的应用因错误而停止。如何处理此类错误

r - 为什么排名函数对所有国家都给予同等的排名?