Nic*_*ick 3 python r shiny reticulate
我有一个应用程序想要部署在shinyapps.io 上。我认为值得注意的是,应用程序中的数据是从 athena 的数据库中提取的。我使用Rathena包连接到数据库,并且所有内容都可以从我的计算机本地正常运行。但是,我尝试将其部署到shinyapps.io 上,但收到一条消息,指出发生了错误。我只是在部署后弹出的窗口中看到了这一点。我查看了shinyapps.io 的日志部分,看到这样的消息:
警告:使用网状但未指定 python;将在 /usr/bin/python3 使用 python 您是否忘记在发布之前在 .Rprofile 中设置 RETICULATE_PYTHON 环境变量?
我从未使用过 .Rprofile,而且我不知道 RETICULATE_PYTHON 是什么意思。无论如何,他们在堆栈溢出上说谷歌是你最好的朋友。我在 Github 上找到了这个名为 Tutorial: using Shiny + reticulate to create apps with R and Python 3 的教程。我按照它所说的执行了最初的步骤,然后在最后说:
确认 .Rprofile 文件包含在您的项目目录中,并与 server.R 和 ui.R 一起部署到shinyapps.io。该文件设置 RETICULATE_PYTHON 环境变量,该变量告诉 reticulate 在shinyapps.io 服务器上的何处定位 Python 虚拟环境。
我查了一下 .Rprofile 是什么,我认为它只是一个代码脚本,但它没有告诉我应该在那里放什么代码。我想我需要提到Rathena包使用 Python 代码来连接到数据库。
我还在某处读到,我应该将此行RETICULATE_PYTHON = /usr/local/bin/python3放在我的 .Renviron 文件中。我这样做了,现在当我尝试在我的计算机上本地运行该应用程序时,我收到错误消息:
错误:未检测到 Boto3 请使用以下任一方式安装 boto3:
pip install boto3 numpy在终端中或install_boto(). 如果这不起作用,请设置您正在使用的 pythonreticulate::use_python()或reticulate::use_condaenv()
这没有意义,因为我已经安装了 boto3,甚至在终端中它也显示
已满足要求:./Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages 中的 boto3 (1.14.28)
我感觉我在这里兜圈子。
这实际上是本地运行软件和在另一个环境中运行的一个相当烦人的问题,我想说解决方案通常是不明显的。您可能不是第一个遇到这种情况的人。
以下是我认为相关的一些事实:
reticulate需要知道你的 Python 可执行文件在计算机上的位置reticulate似乎可以确定 Python 可执行文件来自RETICULATE_PYTHON环境变量的位置,但在未设置变量时也有一些默认行为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'))
}
Run Code Online (Sandbox Code Playgroud)
rstudio-connect他们甚至在其中添加了一个条件块来支持 RStudio Connect,它显然在名为而不是“shiny”的用户下运行你的 Shiny 应用程序:
} else if (Sys.info()[['user']] == 'rstudio-connect'){
Sys.setenv(RETICULATE_PYTHON = paste0(VIRTUALENV_NAME, '/bin/python'))
}
Run Code Online (Sandbox Code Playgroud)
最后,.Rprofile使用一个else语句来捕获任何其他情况,这将与您在自己的计算机上运行时的情况匹配:
} else {
# RETICULATE_PYTHON is not required locally, RStudio infers it based on the ~/.virtualenvs path
Run Code Online (Sandbox Code Playgroud)
根据您上面的描述以及我在链接教程中看到的内容,我认为您几乎可以将它们的全部内容复制.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")
}
Run Code Online (Sandbox Code Playgroud)
然后尝试本地运行并部署。
这种根据程序运行的环境以不同方式设置环境变量的模式实际上是软件工程中相当广泛接受的最佳实践[1],因此当您在本地构建应用程序并将其部署到本地时,这种模式可能会在将来为您提供服务。其他环境。