【问题标题】:Set environment variable in bash in Rmarkdown在 Rmarkdown 中的 bash 中设置环境变量
【发布时间】:2020-06-19 12:05:22
【问题描述】:

我想在 Rmarkdown bash 块中设置一个环境变量,并在以后的 R 块中访问它。本质上,我想做这个问题的反面,这个问题已经回答了很多次了:RMarkdown accessing parameter from bash chunk

我可以使用 R 将参数传递到 bash 块中:

Sys.setenv(MY_PARAM = 'param value')

并在 bash 中访问它:

echo $MY_PARAM

参数值

但是当我尝试在 bash 中存储环境变量时,我稍后无法在 R 中访问它:

再次猛击:

export MY_PARAM2="param value"
echo $MY_PARAM2

参数值

后来的 R 块:

Sys.getenv('MY_PARAM2')

[1] " "

我愿意接受任何其他关于如何将变量从 bash 代码块中传递出来以供以后使用的想法。以下是 Rmarkdown 中复制的全部内容:

```{r}
Sys.setenv(MY_PARAM = 'param value')
```

```{bash}
echo $MY_PARAM
```

```{bash}
export MY_OTHER_PARAM="param value"
echo $MY_OTHER_PARAM
```

```{r}
Sys.getenv('MY_OTHER_PARAM')
```

【问题讨论】:

  • 您可以尝试用自定义系统调用替换Sys.getenv(...),例如:system(command = 'echo %MY_PARAM2%', intern = TRUE)
  • 好主意,但没有这样的运气。运行system(command = 'echo MY_OTHER_PARAM: $MY_OTHER_PARAM') 产生输出MY_OTHER_PARAM:
  • 我不太明白 RMarkdown bash 代码块中的环境是什么,或者为什么它看起来与整体环境不同。或许@yihui-xie 可以澄清一下?
  • 如果您在控制台中运行系统调用(例如,对于其他环境变量,如“PATH”),它是否工作?你在哪个操作系统上?

标签: r bash r-markdown


【解决方案1】:

bash 中的导出值仅在同一会话中可用。出于这个原因,R 将只能看到该值,如果它是在同一个会话中启动的。 如果您是这种情况,那么您的问题已经包含了它应该如何工作的答案。这已被证明有效,请参阅this similar question

但是,如果 R 进程或其子进程在其自己的 shell 中启动,则该 R 进程可能不知道会话变量,例如 MY_OTHER_PARAM。这可能是由 rmarkdown/knitr 处理外部命令的方式引起的。您可以自己使用以下 sn-p 看到这个问题:第二个 bash 会话也不知道导出的变量。 Others 也报告了这个问题。

```{bash}
export MY_OTHER_PARAM="param value"
echo $MY_OTHER_PARAM
```
```{bash}
echo $MY_OTHER_PARAM
```

因此,最简单的解决方案是将信息存储在特定文件中并在后续会话中读取:

```{bash}
echo 'export MY_OTHER_PARAM="param value"' > .rvars
source .rvars
echo $MY_OTHER_PARAM
```
```{bash}
source .rvars
echo $MY_OTHER_PARAM
```

如果我们已经使用文件,我会跳过环境作为返回路径。

```{bash}
echo 'param value' > .myparam
cat .myparam
```
```{bash}
echo $(cat .myparam)
```

```{r}
string <- paste(readLines(".myparam"), collapse=" ")
print(string)
```

【讨论】:

  • 谢谢!我希望避免使用单独的文件,但这是一篇很棒的文章。
  • 考虑declare -p param1 param2 ... &gt; .rvars 是一种更好的写法;使用echo(或以其他方式通过字符串连接)生成代码会受到重大安全/安保问题的影响。 (如果您有 myvar=$'$(rm -rf ~)\'$(rm -rf ~)\'' 等变量,either echo "myvar=$myvar"echo "myvar='$myvar'" 将无法生成重新创建变量的代码,而不会产生明显的意外副作用。
【解决方案2】:

由于 afaik R 在启动时检查 ENV 变量,并且您的 bash 会话仅在该会话开始后创建您感兴趣的变量,这将是一个艰难的过程。我想即使重新启动您的 R 会话也无济于事,因为我猜这也会刷新您的 bash 环境。
我建议将您感兴趣的值放入一个文件中,例如在您的临时目录中,然后在需要时将它们读回您的会话中。
另一种选择是相应地调整 .Renviron。

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 2014-02-24
    • 2012-10-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多