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

Posted

技术标签:

【中文标题】RMarkdown:如何将参数传递给在 R 中定义为变量的 bash 块?【英文标题】:RMarkdown: How to pass arguments to bash chunk defined as variables in R? 【发布时间】:2022-01-14 05:21:36 【问题描述】:

Cross-posted

我想使用在 R 环境中定义的变量作为 bash 块中的参数。有什么办法吗?

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

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

```bash
bash  **path_to_script**
\```

【问题讨论】:

好吧,我不知道 R,但它似乎有 shell 转义函数,你将 100% 需要使用:rdrr.io/r/base/shQuote.html 【参考方案1】:

我认为 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
```

产生这个输出:

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

【讨论】:

不,您的方法不需要shQuote,也就是说,如果您在双引号内展开环境变量:echo "$R_MESSAGE" @Fravadona,我在考虑 Oleg 的示例,其中环境变量中的文本可能包含 bash 认为特殊的字符。 bash "$R_MESSAGE" 会忽略这些,还是对它们采取行动? 这取决于$R_MESSAGE 的扩展时间:如果是调用bash 之前,那么您将需要shQuote。如果它被 bash 扩展,那么双引号就足够了【参考方案2】:

感谢@user2554330 的建议。确实,它似乎以我在问题中解释的方式起作用。但是,建议使用更简单的解决方案here。也就是说,不要使用 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)
```

【讨论】:

是的,这样会更好,但不要跳过shQuote() 的引用。如果here::here() 返回包含特殊字符的内容(例如空格在 Windows 上很常见),它将无法正确执行。

以上是关于RMarkdown:如何将参数传递给在 R 中定义为变量的 bash 块?的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn Pipeline:将参数传递给自定义变压器?

将参数传递给从 R 中的字符串调用的用户定义函数的最佳方法是啥?

在 R data.table 中,如何将变量参数传递给表达式?

如何迭代地将参数传递给 R 函数

如何将用户定义的参数传递给 rpmbuild 以填充变量

如何将自定义参数传递给事件处理程序