RMarkdown: как передать аргументы в блок bash, определенный как переменные в R?

#r #bash #r-markdown

#r #bash #r-markdown

Вопрос:

Перекрестная публикация

Я хочу использовать переменные, определенные в среде R, в качестве аргумента в блоке bash. Есть ли какой-нибудь способ сделать это?

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

 ```{r}
path_to_script <- glue("{here::here()}/bash_scripts/script.sh")
```

```{bash}
bash  **path_to_script**
```
 

Комментарии:

1. Ну, я не знаю R, но, похоже, у него есть escape-функции для оболочки, которые вам нужно будет использовать на 100%: rdrr.io/r/base/shQuote.html

Ответ №1:

Я не думаю, bash что движок knitr выполняет какие-либо замены, но вы должны иметь возможность записывать в переменную среды и использовать ее из bash.

Например,

 ---
title: "Untitled"
date: "09/12/2021"
output: html_document
---


```{r}
msg <- shQuote("This is a message from R.")
Sys.setenv(R_MESSAGE = msg)
```

```{bash}
echo $R_MESSAGE
```
 

который выдает этот вывод:

введите описание изображения здесь

Я добавил shQuote() вызов после прочтения комментария @Fravadona: это определенно действительно хорошая идея, поскольку создаваемый вами путь может содержать пробелы или другие специальные символы.

Комментарии:

1. Нет, shQuote не требуется для вашего метода, то есть, если вы расширяете переменную среды внутри двойных кавычек: echo "$R_MESSAGE"

2. @Fravadona, я думал о примере Олега, где текст в переменной среды может содержать символы, которые bash будут восприниматься как особые. Будет bash "$R_MESSAGE" ли игнорировать их или действовать на них?

3. Это зависит от того, когда $R_MESSAGE расширяется: если это перед вызовом bash, тогда вам понадобится shQuote . если он расширен с помощью bash, тогда достаточно двойных кавычек

Ответ №2:

Спасибо @user2554330 за ваше предложение. Действительно, похоже, что это работает так, как я объяснил в своем вопросе. Однако здесь было предложено немного более простое решение. А именно, не используйте фрагмент bash, а вместо этого создайте строку с полной командой и передайте ее system() функции в R. В этом случае я могу делать все в одной среде.

 ```{r}
path_to_script <- glue("{here::here()}/bash_scripts/script.sh")
arg1 <- "something"
full_command <- glue("bash {path_to_script} {arg1}")
system(full_command)
```
 

Комментарии:

1. Да, это было бы предпочтительнее, но не пропускайте цитирование с shQuote() помощью . Если here::here() возвращает что-то, содержащее специальные символы (например, пробелы будут довольно распространены в Windows), оно не будет выполнено должным образом.