尝试部署到shinyapps.io时出错:应用程序依赖于包&q;包&q;但它不是 [英] Error when trying to deploy to shinyapps.io: Application depends on package "package" but it is not

查看:16
本文介绍了尝试部署到shinyapps.io时出错:应用程序依赖于包&q;包&q;但它不是的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

My server.R包含以下代码,用于在需要时动态安装软件包:

package <- input$chip
if (!require(package, character.only=T, quietly=T)) {
      source("https://bioconductor.org/biocLite.R")
      biocLite(package, ask = F, suppressUpdates = T, suppressAutoUpdate = T)
      library(package, character.only=T)
    }

ui.R有一个选择输入元素,用户可以在其中选择以下BioConductor软件包之一:

selectInput(inputId = 'chip', label='Chip', choices=c('Mouse Gene 1.0'='mogene10sttranscriptcluster.db',
                                                      'Mouse Gene 2.0'='mogene20sttranscriptcluster.db',
                                                      'Human Gene 1.0'='hugene10sttranscriptcluster.db',
                                                      'Human Genome U133A 2.0'='hgu133a2.db'))
因此,根据用户选择的芯片,应该加载相应的注释包,如果还没有安装,则应该安装它。

这在我的本地计算机上工作。但是当我尝试在shinyapps.io上部署我的应用程序时。我收到以下错误:

Error: 
* Application depends on package "package" but it is not installed. Please resolve before continuing.

我知道它无法识别biocLite(package, ask = F, suppressUpdates = T, suppressAutoUpdate = T)中的package。部署过程认为package是库名而不是变量,无法计算其值。

有没有办法解决这个问题?或者,我必须显式加载所有必需的包吗?显式加载注释包的问题是这些包太大,它们占用大量内存,这就是为什么我只想在需要时加载这些包。

另一种方法是根据以下条件创建IF-ELSE循环或SWITCH语句来安装软件包:

package <- function(input$chip) {
  switch(input$chip,
         'mogene10sttranscriptcluster.db' = 'mogene10sttranscriptcluster.db',
         'mogene20sttranscriptcluster.db' = 'mogene20sttranscriptcluster.db',
         'hugene10sttranscriptcluster.db' = 'hugene10sttranscriptcluster.db',
         'hgu133a2.db' = 'hgu133a2.db')
}
library(package)
但即使在这种情况下,部署过程也无法评估包值。

谢谢!

更新: 根据艺慧的建议,我将代码修改为:

package <- input$genome

if(!do.call(require, list(package = package, character.only = T, quietly = T))){
  do.call(biocLite, list(pkgs = package, ask = F, suppressUpdates = T, suppressAutoUpdate = T))
  do.call(library, list(package = package, character.only = TRUE))
}

应用程序现在可以部署,但它抛出此错误:

Error: unable to install packages

推荐答案

不幸的是,您必须稍微愚弄一下shinyapps(或rsconnect)包,以便它不会将package检测为文字包名。例如,您可以使用do.call()

do.call(library, list(package = package, character.only = TRUE))

ShinyApps.io服务器不允许您在飞翔上安装包(严格地说,这不是真的,但我不想向您展示如何安装)。您必须事先将应用程序中需要的所有包声明为依赖项。再说一次,这是一次黑客攻击:

if (FALSE) {
  library(mogene10sttranscriptcluster.db)
  library(mogene20sttranscriptcluster.db)
  library(hugene10sttranscriptcluster.db)
  library(hgu133a2.db)
}
然后,ShinyApps.io会将这些软件包检测为依赖项,并为您预安装它们。在您的应用程序中,您需要做的只是加载它们,而不需要自己安装它们。

这篇关于尝试部署到shinyapps.io时出错:应用程序依赖于包&q;包&q;但它不是的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆