#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), оно не будет выполнено должным образом.