在 Rmarkdown 中的 bash 中设置环境变量

Pat*_*ick 6 bash r r-markdown

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

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

Sys.setenv(MY_PARAM = 'param value')
Run Code Online (Sandbox Code Playgroud)

并在 bash 中访问它:

echo $MY_PARAM
Run Code Online (Sandbox Code Playgroud)

参数值

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

再次重击:

export MY_PARAM2="param value"
echo $MY_PARAM2
Run Code Online (Sandbox Code Playgroud)

参数值

稍后的 R 块:

Sys.getenv('MY_PARAM2')
Run Code Online (Sandbox Code Playgroud)

[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')
```
Run Code Online (Sandbox Code Playgroud)

blu*_*ase 5

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

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

```{bash}
export MY_OTHER_PARAM="param value"
echo $MY_OTHER_PARAM
```
```{bash}
echo $MY_OTHER_PARAM
```
Run Code Online (Sandbox Code Playgroud)

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

```{bash}
echo 'export MY_OTHER_PARAM="param value"' > .rvars
source .rvars
echo $MY_OTHER_PARAM
```
```{bash}
source .rvars
echo $MY_OTHER_PARAM
```
Run Code Online (Sandbox Code Playgroud)

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

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

```{r}
string <- paste(readLines(".myparam"), collapse=" ")
print(string)
```
Run Code Online (Sandbox Code Playgroud)