Установите переменную окружения в bash в Rmarkdown - PullRequest
5 голосов
/ 06 марта 2020

Я хотел бы установить переменную окружения в блоке Rmarkdown bash и получить доступ к нему в более поздних фрагментах R. По сути, я хотел бы сделать противоположный вопрос, на который много раз отвечали: Доступ к параметру RMarkdown из bash chunk

Я могу передать параметр в bash Чанк, используя R:

Sys.setenv(MY_PARAM = 'param value')

И доступ к нему в bash:

echo $MY_PARAM

значение параметра

Но когда я пытаюсь сохранить переменная окружения в bash Я не могу получить к ней доступ в R позже:

Bash снова:

export MY_PARAM2="param value"
echo $MY_PARAM2

значение параметра

Более поздний блок R:

Sys.getenv('MY_PARAM2')

[1] ""

Я был бы открыт для любых других идей о том, как передать переменные из * 1039 кодовый чанк для использования в последующих чанках. Вот все, что нужно для репликации в 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')
```

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Экспортированные значения в bash доступны только в одном сеансе. По этой причине R сможет увидеть это значение, только если оно было запущено в том же сеансе. Если это так, то ваш вопрос уже содержит ответ, как он должен работать. Доказано, что это работает, см. этот похожий вопрос .

Однако, если процесс R или его дочерние процессы запускаются в его собственной оболочке, чем переменная сеанса, такая как MY_OTHER_PARAM вероятно, будет неизвестен этому процессу R. Вероятно, это связано с тем, как rmarkdown / knitr обрабатывает внешние команды. Вы можете увидеть эту проблему с помощью следующего фрагмента: второй сеанс bash также не знает экспортированную переменную. Другие также сообщили об этой проблеме.

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

Итак, самое простое решение - сохранить информацию в указанном файле c и прочитать ее в последующих сеансах:

```{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)
```
0 голосов
/ 06 марта 2020

Так как afaik R проверяет переменные ENV при запуске, и ваш bash сеанс создает интересующие вас переменные только после того, как этот сеанс начнется, что будет непросто. Я полагаю, что даже перезапуск сеанса R не поможет, так как это также будет woudl refre sh your bash env.
Я бы предложил поместить интересующие вас значения в файл, например, во временный каталог и позже. при необходимости прочитайте их обратно в свой сеанс.
Другой вариант - настроить .Renviron соответственно.

...