如何在 R 中设置和使用 bash 变量

How to set and use bash variables in R

我有一个用例,我需要在 R 程序中执行 bash 命令。我可以发送并验证 bash 命令正在执行,但由于我不明白的原因,我无法设置和使用变量。首先,一个简单的命令就可以正常工作:

$ R
...
> system("ls")
1a.csv  1b.csv  2.csv  3.csv
[1] 0
>

现在继续讨论问题。我尝试了尽可能多的方法,但 none 似乎有效:

> system("TEST_VAR=\"test_val\"")
[1] 127
Warning message:
In system("TEST_VAR=\"test_val\"") : 'TEST_VAR="test_val"' not found
> system("bash -c 'REPORT_S3=report_s3_test_val'")
[1] 0
> system("echo ${REPORT_S3}")
$REPORT_S3
[1] 0
> system('TEST_VAR=test_var')
[1] 127
Warning message:
In system("TEST_VAR=test_var") : 'TEST_VAR=test_var' not found
> Sys.setenv(TEST_VAR = "test_val")

> system("echo $TEST_VAR")
$TEST_VAR
[1] 0
> system("bash -c 'export TEST_VAR=\"test_val\"'")
[1] 0
> system(" echo ${TEST_VAR}")
$TEST_VAR
[1] 0

None 次尝试成功。

我需要做的是设置变量,然后使用它们创建更复杂的命令。这在 bash 中工作正常。但我似乎无法让它在 R 中工作,显然是出于上述原因。

REPORT_S3="s3://xxxxxxxx-reports/r/html/"$RMD_FILE"_"$EMAIL_ADDRESS"_"$CLOUDWATCH_UUID".html"
PRESIGNED_URL=$(aws s3 presign --expires-in 604800 $REPORT_S3)
JSON_STRING='xxxxx"$CLOUDWATCH_UUID"xxxxxxx"$PRESIGNED_URL".....'
echo $JSON_STRING > message.json
echo '{"ToAddresses":["'$EMAIL_ADDRESS'"],"CcAddresses":[],"BccAddresses":[]}' > destination.json
aws ses send-email --from xx@yyyyyyyy.co.nz --destination file://destination.json --message file://message.json --region ap-southeast-2

也许除了允许更容易重用原始源 bash 代码的系统之外,还有其他选项可以发出 bash 命令吗?

环境变量是每个进程的,每个 system(..) 调用都会启动一个新进程。如果您在同一个 system 调用中定义和引用该变量,它工作正常:

> system('
  var="foo"
  echo "The variable is: $var"
')
The variable is: foo

如果您将整个脚本放入一个 system(..) 调用中,而不是尝试逐行 运行,它应该可以工作。

另一种方法是使用 Sys.setenv 设置当前 R 进程中的变量,以便将来的 system() 调用继承它:

> Sys.setenv(var = "bar")
> system('echo "The variable is: $var"')
The variable is: bar

显然,由于 Sys.setenv 是一个 R 函数,您必须使用 R 代码来定义变量,而不是依赖 shell 语法,如 $(..)

PS:system() 调用 sh 而不是 bash,因此您传递给它的所有代码都应该与 sh 兼容。