我试图将Shiny应用程序作为R软件包的一部分运行。我按照Dean Attali网站(https://deanattali.com/2015/04/21/r-package-shiny-app/)上列出的说明进行操作。
如该网站所示,我在R包中创建了以下目录:
- mypackage
|- inst
|- shiny-examples
|- myapp
|- ui.R
|- server.R
|- R
|- runExample.R
|- ...
|- DESCRIPTION
|- ...
然后,在我的runExample.R文件中,我使用了:
#' @export
runExample <- function() {
appDir <- system.file("shiny-examples", "myapp", package = "mypackage")
if (appDir == "") {
stop("Could not find example directory. Try re-installing `mypackage`.", call. = FALSE)
}
shiny::runApp(appDir, display.mode = "normal")
}
唯一的区别是我试图在上面的function()中输入一个参数。它称为数据,所以我正在使用function(data = data)。
但是,如果我运行runExample(data = myData),则会导致与数据相关的错误(“'closure'类型的对象不可子集化”)。我相信这是因为data = myData无法成功传输到Shiny应用程序。任何有关如何解决此问题的想法将不胜感激!
答案 0 :(得分:2)
您可以使用环境在R中几乎任何地方移动数据。我认为这可能有效:
### runExample.R
PKGENVIR <- new.env(parent=emptyenv()) # package level envir
#' @export
runExample <- function(data) {
appDir <- system.file("shiny-examples", "myapp", package = "mypackage")
if (appDir == "") {
stop("Could not find example directory. Try re-installing `mypackage`.", call. = FALSE)
}
PKGENVIR$DATA <- data # put the data into envir
shiny::runApp(appDir, display.mode = "normal")
}
然后在server.R中:
### inside shiny app
data <- PACKAGE_NAME:::PKGENVIR$DATA ## read the data from envir