image_composite (Magick) return Shiny Flexdashboard 错误
image_composite (Magick) return error in Shiny Flexdashboard
我需要在 Shiny Flexdashboard 中构建合成图片,以将 Ggplot2 图表放置在背景图像上。
我使用以下代码:
```{r}
renderImage({
bkgDom <- image_read('background.png')
myChart <- ggplot(data=individualObs, aes(individualObs$SA)) + geom_histogram()
fig <- image_graph(width = 600, height = 550)
myChart
dev.off()
image_composite(bkgDom, fig, offset = "+1030+50", operator = "multiply") }, deleteFile = TRUE)
renderImage() 中的代码在 RStudio 中运行良好,但 returns 在 Shiny Flexdashboard 代码中使用时出现错误“'externalptr' 类型的对象不可子集化”。
知道如何解决这个问题吗?
在此先感谢您的支持!
查看 the docs,它说表达式应该 return 一个列表。因为你写的 returns 是一个 'externalptr' 类型的对象(所以我猜 image_composite()
文档没有告诉我输出的值),我认为错误是因为shiny找不到src。另外,您的合成图像可能也需要临时保存。
没有足够的代码来重现,但从文档中应该可以解决这个问题:
renderImage({
bkgDom <- image_read('background.png')
myChart <- ggplot(data=individualObs, aes(individualObs$SA)) + geom_histogram()
fig <- image_graph(width = 600, height = 550)
myChart
dev.off()
# A temp file to save the output.
outfile <- tempfile(fileext='.png')
png(outfile)
image_composite(bkgDom, fig, offset = "+1030+50", operator = "multiply")
dev.off()
# Return a list containing the filename
list(src = outfile,
alt = "This is alternate text")
}, deleteFile = TRUE)
我单独保存了合成图,但这可能与您修改的其他图像同步完成?
如果这不起作用,您能否提供更多代码以使其可重现?
无论出于何种原因,临时文件存在问题,因此我使用了 image_write() 函数来保存 image_composite() 的结果,然后使用列表检索文件() 函数。
此外,为了避免创建空文件,必须通过 print() 函数公开 Ggplot2 图表。
这是在 Shiny Flexidashboard 中运行的代码:
renderImage({
#Set the first image-magic pointer
bkgDom <- image_read('background.png')
myChart <- ggplot(data=individualObs, aes(individualObs$SA)) + geom_histogram()
#Set the space to load the Ggplot chart in
fig <- image_graph(width = 400, height = 400)
#Print the Ggplot chart into the fig pointer
print(myChart)
#Create the composite image into a image-magick pointer and adjust the position
pic <- image_composite(bkgDom, fig, offset = "+580-25", operator = "multiply")
#Save the pointer into a png file
image_write(pic,"test.png")
#Read and show the png file
list(src = "test.png", contentType = 'image/png', width="100%")
}, deleteFile = TRUE)
我需要在 Shiny Flexdashboard 中构建合成图片,以将 Ggplot2 图表放置在背景图像上。
我使用以下代码:
```{r}
renderImage({
bkgDom <- image_read('background.png')
myChart <- ggplot(data=individualObs, aes(individualObs$SA)) + geom_histogram()
fig <- image_graph(width = 600, height = 550)
myChart
dev.off()
image_composite(bkgDom, fig, offset = "+1030+50", operator = "multiply") }, deleteFile = TRUE)
renderImage() 中的代码在 RStudio 中运行良好,但 returns 在 Shiny Flexdashboard 代码中使用时出现错误“'externalptr' 类型的对象不可子集化”。
知道如何解决这个问题吗?
在此先感谢您的支持!
查看 the docs,它说表达式应该 return 一个列表。因为你写的 returns 是一个 'externalptr' 类型的对象(所以我猜 image_composite()
文档没有告诉我输出的值),我认为错误是因为shiny找不到src。另外,您的合成图像可能也需要临时保存。
没有足够的代码来重现,但从文档中应该可以解决这个问题:
renderImage({
bkgDom <- image_read('background.png')
myChart <- ggplot(data=individualObs, aes(individualObs$SA)) + geom_histogram()
fig <- image_graph(width = 600, height = 550)
myChart
dev.off()
# A temp file to save the output.
outfile <- tempfile(fileext='.png')
png(outfile)
image_composite(bkgDom, fig, offset = "+1030+50", operator = "multiply")
dev.off()
# Return a list containing the filename
list(src = outfile,
alt = "This is alternate text")
}, deleteFile = TRUE)
我单独保存了合成图,但这可能与您修改的其他图像同步完成?
如果这不起作用,您能否提供更多代码以使其可重现?
无论出于何种原因,临时文件存在问题,因此我使用了 image_write() 函数来保存 image_composite() 的结果,然后使用列表检索文件() 函数。
此外,为了避免创建空文件,必须通过 print() 函数公开 Ggplot2 图表。
这是在 Shiny Flexidashboard 中运行的代码:
renderImage({
#Set the first image-magic pointer
bkgDom <- image_read('background.png')
myChart <- ggplot(data=individualObs, aes(individualObs$SA)) + geom_histogram()
#Set the space to load the Ggplot chart in
fig <- image_graph(width = 400, height = 400)
#Print the Ggplot chart into the fig pointer
print(myChart)
#Create the composite image into a image-magick pointer and adjust the position
pic <- image_composite(bkgDom, fig, offset = "+580-25", operator = "multiply")
#Save the pointer into a png file
image_write(pic,"test.png")
#Read and show the png file
list(src = "test.png", contentType = 'image/png', width="100%")
}, deleteFile = TRUE)