如何让 R 读取我的环境变量?
Posted
技术标签:
【中文标题】如何让 R 读取我的环境变量?【英文标题】:How can I make R read my environmental variables? 【发布时间】:2012-08-30 18:17:20 【问题描述】:我在 EC2 Spot 实例上运行 R,我需要 R 来终止实例并在脚本运行后取消 Spot 请求。
为此,我已将“请求 ID”设置为 /.bashrc
中的环境变量,我的计划是在脚本准备好后将以下代码简单地调用到 R 中
system("ec2-cancel-spot-instance-requests $SIR")
我遇到的问题是,当我从 R 外部键入 env
时,R 没有“看到”相同的环境变量,因此该命令不起作用。
我已经检查过,如果我将环境变量设置为/etc/environment
,R 能够看到这些变量,但这是另一个问题。由于这些变量是动态的(每次创建 Spot 实例时实例 ID 和请求 ID 都不同),我正在运行一个脚本以以下形式创建它们:
export SIR=`cat /etc/ec2_instance_spot_id.txt`
该文件包含动态 ID 的位置
那么,如何将“动态”环境变量插入到 /etc/environment
中?或者,如何让 R 读取 /.bashrc
处的环境变量?
任何正确方向的提示将不胜感激!
【问题讨论】:
我发现 ~/.profile 中的变量可以从 Sys.getenv() 访问,但不能从 ~/.bashrc 访问。在添加新变量后,我必须从终端执行source ~/.profile
,然后执行R
才能使其工作。
【参考方案1】:
我对 R 很陌生,但我的方法是:我将项目级环境变量存储在 .env
文件中。为了使其在 R 中可访问,我使用了
> readRenviron(".env")
然后去访问一个特定的变量
> Sys.getenv("RDS_UID")
而且效果很好。
【讨论】:
【参考方案2】:使用Sys.getenv()
,您会看到当前环境中列出的所有变量。
但是,它们与当前 shell 中使用的不同,例如在 .profile 中指定的。
要为 R 设置变量,请在您的主目录中创建一个 .Renviron
文件并在那里写入
MYDIRECTORY="/home/wherever"
重新启动 R 后,您将能够访问此变量
Sys.getenv("MYDIRECTORY")
【讨论】:
我的主目录没有 .Renviron 文件,并且在我几天前更改值后,它在 R 内部返回了环境变量的旧值。无法弄清楚 R 从哪里获取旧值并且没有返回新值。【参考方案3】:你想要Sys.getenv()
,就像Sys.getenv("PATH")
一样。
或者你的例子,试试
SIR <- Sys.getenv("SIR")
system(paste("ec2-cancel-spot-instance-requests", SIR))
关于启动时设置变量,见help(Startup)
了解~/.Renvironment
等
【讨论】:
非常感谢 Dirk 抽出宝贵时间。我遇到的问题是,当我做names(s <- Sys.getenv())
时,SIR
不存在,当我做 SIR <- Sys.getenv("SIR")
时,SIR 中什么都没有,但是当我退出 R 并且我做 env
时,环境列表变量与我在Sys.getenv()
时得到的完全不同,在那里我可以看到 SIR 和我需要的其他变量。我会看看Renvironment
,再次非常感谢。
好吧,这太丢人了。如果我已经创建了两个具有请求 ID 和实例 ID 的文件,为什么还要读取 R 中的环境变量?我可以获取这些文件的值并执行我的任务......这并不能解释为什么 R 没有看到与我退出 R 时看到的相同的环境变量,但会让我继续前进!感谢您的启发!
我通过使用Sys.setenv()
并基本上将我的环境变量从 R 外部复制到 R 来完成这项工作。虽然这使我的脚本工作,但我希望我能理解为什么会有一整套不同的环境变量知道R以上是关于如何让 R 读取我的环境变量?的主要内容,如果未能解决你的问题,请参考以下文章