在R包中包含Shiny应用:传输输入参数

时间:2018-10-03 06:45:02

标签: r shiny

我试图将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应用程序。任何有关如何解决此问题的想法将不胜感激!

1 个答案:

答案 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