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 中的字符串调用的用户定义函数的最佳方法是啥?