如何让 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 &lt;- Sys.getenv()) 时,SIR 不存在,当我做 SIR &lt;- Sys.getenv("SIR") 时,SIR 中什么都没有,但是当我退出 R 并且我做 env 时,环境列表变量与我在Sys.getenv() 时得到的完全不同,在那里我可以看到 SIR 和我需要的其他变量。我会看看Renvironment,再次非常感谢。 好吧,这太丢人了。如果我已经创建了两个具有请求 ID 和实例 ID 的文件,为什么还要读取 R 中的环境变量?我可以获取这些文件的值并执行我的任务......这并不能解释为什么 R 没有看到与我退出 R 时看到的相同的环境变量,但会让我继续前进!感谢您的启发! 我通过使用Sys.setenv() 并基本上将我的环境变量从 R 外部复制到 R 来完成这项工作。虽然这使我的脚本工作,但我希望我能理解为什么会有一整套不同的环境变量知道R

以上是关于如何让 R 读取我的环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python 2.7从特定文件中读取环境变量

Windows环境变量配置与读取

如何将环境变量传递给pytest

如何在 .NET 6 中读取环境变量?

如何在vbs中设置可以在调用批处理脚本中读取的环境变量

如何在 Postman 测试中读取环境变量?