这实际上是本地运行软件和在另一个环境中运行的一个相当烦人的问题,我想说解决方案通常是不明显的。您可能不是第一个遇到这种情况的人。
以下是我认为相关的一些事实:
-
reticulate
需要知道where你的Python可执行文件在计算机上
- Python 可执行文件的位置differs在您的计算机和虚拟计算机之间shinyapps.io运行您的Shiny应用程序
-
reticulate
似乎可以确定你的Python可执行文件来自哪里RETICULATE_PYTHON
环境变量,但在未设置该变量时也有一些默认行为
- 您计算机上的 Python 可执行文件位于不同的比虚拟计算机上的可执行文件的位置shinyapps.io运行您的Shiny应用程序
- 当您设置的值
RETICULATE_PYTHON
在你的.Rprofile
对于shinyapps.io 需要的值,您的设置会中断,因为您的Python 环境不同
我还没有测试过这个解决方案,但我认为修复实际上在您的链接中!查看https://github.com/ranikay/shiny-reticulate-app/blob/master/.Rprofile看看它们如何包含比简单的值分配更多的内容RETICULATE_PYTHON
并实际使用条件语句根据结果设置各种值(Sys.info()[['user']]
.
的价值(Sys.info()[['user']]
根据 R 是否执行而有所不同.Rprofile
在本地计算机上与虚拟计算机上shinyapps.io 运行您的 Shiny 应用程序并链接.Rprofile
正在根据 R 是在本地计算机还是另一台计算机上运行来设置各种值。这一切都有效,因为shinyapps.io
从.Rprofile中的代码,我可以看出shinyapps.io在名为“shiny”的用户下运行您的Shiny应用程序,
if (Sys.info()[['user']] == 'shiny'){
Sys.setenv(RETICULATE_PYTHON = paste0('/home/shiny/.virtualenvs/', VIRTUALENV_NAME, '/bin/python'))
}
他们甚至在其中添加了一个条件块来支持 RStudio Connect,它显然在名为的用户下运行你的 Shiny 应用程序rstudio-connect
而不是“闪亮”:
} else if (Sys.info()[['user']] == 'rstudio-connect'){
Sys.setenv(RETICULATE_PYTHON = paste0(VIRTUALENV_NAME, '/bin/python'))
}
最后,.Rprofile
使用一个else
语句来捕获任何其他情况,这将与您在自己的计算机上运行时的情况匹配:
} else {
# RETICULATE_PYTHON is not required locally, RStudio infers it based on the ~/.virtualenvs path
根据您上面的描述以及我在链接教程,我想你几乎可以复制整个.Rprofile
他们已经将其添加到您的项目中,并且可能只需要进行一两个小的修改,您应该就可以让您的 Shiny 应用程序在本地和闪亮的应用程序上运行reticulate
.
然而,我们看到not环境RETICULATE_PYTHON
遵循通过运行 virtualenv 定义的行为,因此我可能建议设置RETICULATE_PYTHON
这里的值例如位置或基于 miniconda 的 Python 可执行文件。我猜这个值可能是./Library/r-miniconda/envs/r-reticulate/bin/python3
或类似的。
如果您不想复制链接.Rprofile
并根据需要修改它,您可能只需将其更改为仅包含此行:
if (Sys.info()[['user']] == 'shiny'){
Sys.setenv(RETICULATE_PYTHON = "/usr/local/bin/python3")
}
然后尝试本地运行并部署。
这种根据程序运行的环境以不同方式设置环境变量的模式实际上是软件工程中相当广泛接受的最佳实践[1],因此当您在本地构建应用程序并将其部署到本地时,这种模式可能会在将来为您提供服务。其他环境。
[1] https://12factor.net