在 R Shiny 中显示本地存储的图像
Display locally-stored image in R Shiny
我花了相当多的时间试图解决这个问题。
当然,在这里分享我的问题之前,我做了功课。
特别是我咨询过没有成功:
- Shiny can not display Image locally
- adding local image with html to a Shiny app
- Embedding Image in Shiny App
所以我确实在 RStudio 项目文件的根目录下创建了一个 'www' 文件夹,我在其中放了一些图片。
这些图片在 titlePanel 中使用,但也由应用程序调用的主要 htmlwidget 使用。
将这些图片存储在本地对我来说至关重要,因为应用程序可能 运行 处于安全环境中,无法访问 Internet。
我尝试了这些图片的相对路径和绝对路径:没有显示图片。
然后我注意到某种不一致:只有当我通过 RStudio 中的常规命令“运行 选定的行”运行 应用程序时,我才会遇到这个问题。
另一方面,当我通过专用命令“运行 App”(在 RStudio 的右上角,绿色箭头)运行 应用程序时,我不再有这个问题,图片显示效果很好(但输入数据以某种方式被检查并且在应用程序启动之前需要花费很多时间)。
最初我认为显示本地图像会比存储在 Internet 上的远程图像容易得多,但似乎恰恰相反。
因此我的问题是:
- 你知道为什么我们可以观察到这种差异(这对我来说是不一致的)吗?
- 你知道我怎么还能继续使用常规执行命令(“运行 Selected Line(s)”)吗?
此致,
奥利维尔
管理目录可能很棘手。
您可以使用 here
包来简化 R 项目中目录的处理,请参阅 Ode to the here package。
打开项目后,可以通过以下方式轻松访问 www
中的图像:
here::here('www/myimage.jpg')
这也适用于采购应用程序或脚本。
对我来说,当通过 Run Selected Line(s)
在 RStudio 中 运行 应用程序时,以下内容也有效:
library(shiny)
# create some local images
if(!dir.exists("myimages")){
dir.create("myimages")
}
myPlotPaths <- paste0("myimages/myplot", seq_len(3), ".png")
for (myPlot in myPlotPaths) {
png(file = myPlot, bg = "transparent")
plot(runif(10))
dev.off()
}
myImgResources <- paste0("imgResources/myplot", seq_len(3), ".png")
# Add directory of static resources to Shiny's web server
addResourcePath(prefix = "imgResources", directoryPath = "myimages")
ui <- fluidPage(
tags$img(src = myImgResources[1], width = "400px", height = "400px"),
tags$img(src = myImgResources[2], width = "400px", height = "400px"),
tags$img(src = myImgResources[3], width = "400px", height = "400px")
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
我没有具体的答案,但 Hadley 在 'Mastering shiny' 书中的 'Graphics' 章节下展示了如何显示本地存储的图像的示例。这本书正在开发中,应该很快就会发布,我将粘贴该章节的link:
示例在图片部分。
HTH
我花了相当多的时间试图解决这个问题。 当然,在这里分享我的问题之前,我做了功课。
特别是我咨询过没有成功:
- Shiny can not display Image locally
- adding local image with html to a Shiny app
- Embedding Image in Shiny App
所以我确实在 RStudio 项目文件的根目录下创建了一个 'www' 文件夹,我在其中放了一些图片。
这些图片在 titlePanel 中使用,但也由应用程序调用的主要 htmlwidget 使用。
将这些图片存储在本地对我来说至关重要,因为应用程序可能 运行 处于安全环境中,无法访问 Internet。
我尝试了这些图片的相对路径和绝对路径:没有显示图片。
然后我注意到某种不一致:只有当我通过 RStudio 中的常规命令“运行 选定的行”运行 应用程序时,我才会遇到这个问题。 另一方面,当我通过专用命令“运行 App”(在 RStudio 的右上角,绿色箭头)运行 应用程序时,我不再有这个问题,图片显示效果很好(但输入数据以某种方式被检查并且在应用程序启动之前需要花费很多时间)。
最初我认为显示本地图像会比存储在 Internet 上的远程图像容易得多,但似乎恰恰相反。
因此我的问题是:
- 你知道为什么我们可以观察到这种差异(这对我来说是不一致的)吗?
- 你知道我怎么还能继续使用常规执行命令(“运行 Selected Line(s)”)吗?
此致,
奥利维尔
管理目录可能很棘手。
您可以使用 here
包来简化 R 项目中目录的处理,请参阅 Ode to the here package。
打开项目后,可以通过以下方式轻松访问 www
中的图像:
here::here('www/myimage.jpg')
这也适用于采购应用程序或脚本。
对我来说,当通过 Run Selected Line(s)
在 RStudio 中 运行 应用程序时,以下内容也有效:
library(shiny)
# create some local images
if(!dir.exists("myimages")){
dir.create("myimages")
}
myPlotPaths <- paste0("myimages/myplot", seq_len(3), ".png")
for (myPlot in myPlotPaths) {
png(file = myPlot, bg = "transparent")
plot(runif(10))
dev.off()
}
myImgResources <- paste0("imgResources/myplot", seq_len(3), ".png")
# Add directory of static resources to Shiny's web server
addResourcePath(prefix = "imgResources", directoryPath = "myimages")
ui <- fluidPage(
tags$img(src = myImgResources[1], width = "400px", height = "400px"),
tags$img(src = myImgResources[2], width = "400px", height = "400px"),
tags$img(src = myImgResources[3], width = "400px", height = "400px")
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
我没有具体的答案,但 Hadley 在 'Mastering shiny' 书中的 'Graphics' 章节下展示了如何显示本地存储的图像的示例。这本书正在开发中,应该很快就会发布,我将粘贴该章节的link:
示例在图片部分。
HTH