RMarkdown:如何将参数传递给在R中定义为变量的bash代码块?

4

已转载

我想在bash块中使用在R环境中定义的变量作为参数。有没有办法实现这一点?

例如,在下面的示例中,我想使用R来定义脚本的路径并将其作为参数传递给bash:

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

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

1
嗯,我不懂R语言,但它似乎有用于shell的转义函数,你肯定需要使用:https://rdrr.io/r/base/shQuote.html - Fravadona
2个回答

7
我认为knitr的bash引擎不会进行任何替换,但您应该能够编写到环境变量,并从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
```

它会产生以下输出:

enter image description here

在阅读@Fravadona的评论后,我添加了shQuote()调用:这绝对是一个非常好的想法,因为你构造的路径可能包含空格或其他特殊字符。


不需要使用 shQuote,只要在双引号内展开环境变量即可:echo "$R_MESSAGE" - Fravadona
@Fravadona,我在考虑Oleg的例子,环境变量中的文本可能包含bash视为特殊字符的字符。 bash "$R_MESSAGE"会忽略它们还是对它们进行操作? - user2554330
这取决于 $R_MESSAGE 何时被扩展:如果是在调用 bash 之前,那么你需要使用 shQuote。如果是由 bash 扩展的,那么双引号就足够了。 - Fravadona

0

感谢@user2554330的建议。实际上,它似乎按照我在问题中解释的方式工作。然而,这里提出了一个更简单的解决方案。即,不使用bash块,而是创建一个包含完整命令的字符串,并将其传递给R中的system()函数。在这种情况下,我可以在同一环境中完成所有操作。

```{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 上空格很常见),它将无法正确执行。 - user2554330

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接