1 回答
TA贡献1848条经验 获得超6个赞
这实际上是本地运行软件和在另一个环境中运行的一个相当烦人的问题,我想说解决方案通常是不明显的。您可能不是第一个遇到这种情况的人。
以下是我认为相关的一些事实:
reticulate
需要知道你的 Python 可执行文件在计算机上的位置Python 可执行文件的位置在您的计算机和虚拟计算机之间有所不同。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
他们甚至在其中添加了一个条件块来支持 RStudio Connect,它显然在名为而不是“shiny”的用户下运行你的 Shiny 应用程序:
} 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
到您的项目中,并且可能只需要一两个小的修改,您应该能够获得闪亮的应用程序在本地和shinyapps.io 上运行,带有reticulate
.
但是,我们发现不设置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") }
然后尝试本地运行并部署。
添加回答
举报