在 Rmarkdown 中执行 Perl 6 代码

Executing Perl 6 code in Rmarkdown

我想写一些关于 Perl 6 的教程。对此我相信 Rmarkdown 会有很大的帮助。

所以我试图在 Rmarkdown 文档中执行 Perl 6 代码。

我的 Perl 6 可执行文件在 C:\rakudo\bin 中。 因此,我的 .Rmd 文件中包含用于完成此操作的示例代码如下:

---
title: "Example"
output: html_document
---

```{r, engine='perl6', engine.path='C:\rakudo\bin'}
my $s= "knitr is really good";
say $s;
```

然而,在 Rstudio 中编织上述文档显示了以下没有 Perl 6 输出的内容。

有什么我遗漏的帮助吗?

不是我的专业领域,但是 help of a blog 我设法让它产生输出。

首先,查看 RStudio 的 R Markdown 选项卡。它向您显示一条警告,解释为什么您的版本没有呈现任何内容:

Warning message:
In get_engine(options$engine) :
  Unknown language engine 'perl6' (must be registered via knit_engines$set()).

考虑到这一点,我们可以查看如何注册引擎并执行此操作:

```{r setup, echo=FALSE}
library(knitr)
eng_perl6 <- function(options) {
  # create a temporary file
  f <- basename(tempfile("perl6", '.', paste('.', "perl6", sep = '')))
  on.exit(unlink(f)) # cleanup temp file on function exit
  writeLines(options$code, f)
  out <- ''

  # if eval != FALSE compile/run the code, preserving output
  if (options$eval) {
    out <- system(sprintf('perl6 %s', paste(f, options$engine.opts)), intern=TRUE)
  }

  # spit back stuff to the user
  engine_output(options, options$code, out)
}

knitr::knit_engines$set(perl6=eng_perl6)
```

```{r, engine='perl6'}
my $s= "knitr is really good";
say $s;
```

引擎注册了一个函数,该函数首先将代码保存到 运行 一个临时文件,然后执行 Rakudo 编译器,要求它编译该文件。

在收集到所需的输出后,该函数会删除临时文件并为我们提供渲染输出。

你的例子有两个问题。首先,我认为您仍然可以使用现有的 perl 引擎(perl6 不是有效的引擎名称)。其次,engine.path option 应该指向可执行文件的路径而不是目录名,例如

---
title: "Example"
output: html_document
---

```{perl, engine.path='C:\rakudo\bin\perl6.exe'}
my $s= "knitr is really good";
say $s;
```

您还可以为 perl 引擎全局设置引擎路径:

```{r, setup, include=FALSE}
knitr::opts_chunk$set(engine.path = list(
  perl = 'C:\rakudo\bin\perl6.exe'
))
```

在 windows 的命令提示符下,这有效:

perl6 -e "say 'hello'"

但这失败了:

perl6 -e 'say "hello"'

您必须在命令提示符中使用双引号来引用参数。