meeeeeeeeo
Cloud2016
确实,plot
返回NULL应该是原因。不过我对shiny
交互运行的原理其实并不完全理解。我给renderSVG
加了一些打印,来查看expr
传入的到底是啥
renderSVG <- function(expr,id,...) {
session <- get("session",envir = rlang::caller_env())
renderImage({
width <- session$clientData[[sprintf("output_%s_width",id)]]
height <- session$clientData[[sprintf("output_%s_height",id)]]
print("before capture, the expr is: ")
print(rlang::enexpr(expr))
file <- htmltools::capturePlot(
expr,
tempfile(fileext = ".svg"),
svglite::svglite,
width = width/96, height = height/96, ...
)
print("after capture, the `expr` is :“)
print(rlang::enexpr(expr))
print(file) # this is the filename of image
list(src = file,contentType = 'image/svg+xml')
},
deleteFile = FALSE)
}
可以发现,除了启动时候第一次的expr
是用户传入的表达式,后面的都是expr
运行后的结果。所以如果server
函数里用的ggplot
,那么上面的函数会打印第一次运行的表达式,后续会在rstudio的plots面板里画图。而如果server
函数里用的plot
,那么上面的函数会在第一次时打印表达式,后续在控制台打印的都是NULL,因为plot
返回的是NULL。所以相当于除了启动时运行了一次,后面交互的时候都是直接拿的之前的运行结果?这里是个我不太明白shiny运行原理的地方。
而如果把renderSVG
里面captureplot
那里换成
file <- htmltools::capturePlot(
!!rlang::enexpr(expr),
tempfile(fileext = ".svg"),
svglite::svglite,
width = width/96, height = height/96, ...
)
应该就和链接里给的解答效果一致,可以使得每次传给capturePlot
的都是用户给的表达式。