我正在尝试将多个图像添加到 R 中的数据帧中,以在 R Shiny 中以 DT::dataTableOutput 的形式重现。
所需的输出如下所示:
我发现这个问题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")
)
)
)
关于R:将多个图像添加到数据框/数据表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72013790/