Shiny 应用程序的版本规范无效

Invalid version specification on Shiny app

当我尝试将我的(网状驱动的)Shiny 应用程序部署到 shinyapps.io 时,出现以下错误:

Error in value[[3L]](cond) : invalid version specification ‘20.1b1’
Calls: local ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted

虽然不明确,但我想错误是指 pip 版本,我从未明确指定。

这是 ui 和服务器函数之前的代码部分:

library(reticulate)
library(shiny)

virtualenv_create(envname = "elicit", python="python3")
virtualenv_install("elicit", packages = c('numpy', 'Gpy'))
use_virtualenv("elicit", required = TRUE)

当我将其与来自 UI 和服务器的任何 Python 相关代码一起注释掉时,一切正常。

如何设置站点请求的有效版本?我看到 reticulate::virtualenv 有一个 pip_options 参数,但我找不到关于如何使用它的有用文档。

我也不是很擅长设置虚拟和 conda 环境,所以我很可能会遗漏一些基本步骤。

更新

我注意到,如果我调换 use_virtualenvvirtualenv_install 调用的顺序,我会得到一个不同的错误:

ERROR: The requested version of Python
('~/.virtualenvs/elicit/bin/python') cannot be used, as another version
of Python ('/usr/bin/python3') has already been initialized. Please
restart the R session if you need to attach reticulate to a different
version of Python.
Error in value[[3L]](cond) : 
  failed to initialize requested version of Python
Calls: local ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted

我已经尝试了所有我能想到的方法,但我也无法解决这个问题。

我实际上找到了解决这个问题的方法。由于在您创建 virtualenv 后会立即安装有漏洞的 pip 版本,因此我强行卸载了它,然后安装了在构建我的应用程序时可用的版本。这是我使用的代码:

virtualenv_create(envname = "python_environment", python = "python3")
virtualenv_remove(envname = "python_environment", packages = "pip")
virtualenv_install(envname = "python_environment", packages = c("pip==19.0.3","numpy","nltk","torch"), ignore_installed = TRUE)
use_virtualenv("python_environment", required = TRUE)

我写这篇文章是作为对已接受答案的评论,但我也将其作为答案发布,以提高可见性和进一步解释。

最终对我的案例有用的是创建一个包含以下行的 .Rprofile 文件:

Sys.setenv(RETICULATE_PYTHON = "~/.virtualenvs/elicit/bin/python3")

该文件应位于与 app.R 相同的文件夹中,并且应部署到远程服务器。最终的 app.R 文件看起来就像问题中发布的文件。


更新: 这最终又坏了,对我来说修复它的是删除并重新安装 pip(正如 theThalamus 所指出的),但没有指定 pip 版本。所以 app.R 看起来像这样:

virtualenv_create(...)  # create virtual environment
virtualenv_remove(envname = "python_environment", packages = "pip")
virtualenv_install(envname = "python_environment", packages = "pip")
virtualenv_install(...)  # install other packages

这两个 virtualenv_install 实例可能会合并,但我决定将它们分开以突出修复。