问题 如何让R读取我的环境变量?


我在EC2现场实例上运行R,我需要R来终止实例并在脚本运行后取消现场请求。

为此,我已将“请求ID”设置为环境变量 /.bashrc 我的计划是在脚本准备好后简单地将以下代码调用到R中

system("ec2-cancel-spot-instance-requests $SIR")

我遇到的问题是R没有“看到”我输入的相同环境变量 env 从外部R,因此命令不起作用。

我已经检查过,如果我将环境变量设置为 /etc/environment R能够看到这些变量,但这是另一个问题。由于这些变量是动态的(每次创建专色实例时实例ID和请求ID都不同),我运行的脚本以下列形式创建它们:

export SIR=`cat /etc/ec2_instance_spot_id.txt`

该文件包含动态ID的位置

那么,我如何插入“动态”环境变量 /etc/environment ?或者,我如何让R读取环境变量 /.bashrc

任何正确方向的提示将非常感谢!


8104
2017-09-06 00:16


起源

我发现〜/ .profile中的变量可以从Sys.getenv()访问,但不能从〜/ .bashrc访问。我必须做 source ~/.profile, 然后 R 从终端开始,在添加新变量后使其工作。 - wordsforthewise


答案:


你要 Sys.getenv() 如在 Sys.getenv("PATH"),说。

或者为你的例子,试试吧

SIR <- Sys.getenv("SIR")   
system(paste("ec2-cancel-spot-instance-requests",  SIR))

至于启动时设置变量,请参阅 help(Startup) 学习关于 ~/.Renvironment 等等


10
2017-09-06 00:27



非常感谢德克的时间。我遇到的问题是,当我做的时候 names(s <- Sys.getenv()) 然后 SIR 我不在的时候 SIR <- Sys.getenv("SIR") SIR中没有任何东西,但是当我退出R而我这样做时 env 环境变量列表与我得到的完全不同 Sys.getenv() 在那里我可以看到SIR和我需要的其他人。我来看看 Renvironment,再次感谢。 - JordanBelf
好的,这是可耻的。如果我已经创建了带有请求ID和实例ID的2个文件,我为什么要读取R中的环境变量?我可以获得这些文件的价值并执行我的任务...这并不能解释为什么R没有看到与我退出R时看到的相同的环境变量,但会让我开始!感谢您的灵感! - JordanBelf
我通过使用来完成这项工作 Sys.setenv() 并且基本上将我的环境变量从外部R复制到R.虽然这使得我的脚本工作,但我希望我能理解为什么有一整套不同的环境变量适合R - JordanBelf


运用 Sys.getenv() 您会看到当前环境中列出的所有变量。

但是,它们与当前shell中使用的不同,例如.profile中指定的那些。

要为R设置变量,请创建一个 .Renviron 将文件放在您的主目录中并写入

MYDIRECTORY="/home/wherever"

重新启动R后,您将能够访问此变量

Sys.getenv("MYDIRECTORY")

6
2018-03-10 08:03



我的主目录没有.Renviron文件,在R里面它在我几天前更改了值之后返回了环境变量的旧值。无法确定R获取旧值的位置并且不返回新值。 - Kemin Zhou