在Rmarkdown中执行Perl 6代码

12

我想写一些关于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输出,只显示如下内容。 enter image description here

请问我错过了什么地方吗?

3个回答

13

不是我的专业领域,但通过博客的帮助,我成功使其产生了输出。

首先,请查看 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编译器,要求其编译该文件。

在收集所需输出后,该函数会删除临时文件并提供用于呈现的输出。


请随时在我们的IRC支持频道上提及您的教程,这样更多的人就会知道它们 :) - user2410502

3

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

---
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'
))
```

1
我尝试了你的第一个帮助,但它没有起作用。这是我得到的错误信息:running: C:\rakudo\bin\perl6.exe -e "my $s= \"knitr is really good\"; say $s;" Quitting from lines 7-9 (ds.Rmd) Error in system2(cmd, code, stdout = TRUE, stderr = TRUE, env = options$engine.env) : '"C:\rakudo\bin\perl6.exe"' not found Calls: <Anonymous> ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous> Execution halted 。即使第二个解决方案也不起作用。可能出了什么问题? - Suman Khanal
Sys.which('perl6') 会输出 "C:\\rakudo\\bin\\perl6.bat",而 Sys.getenv('PATH') 则会输出 "C:\\Program Files\\R\\R-3.4.1patched\\bin\\x64;c:\\Rtools\\bin;c:\\Rtools\\mingw_32\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\curl\\bin;C:\\wget;C:\\Strawberry Perl\\perl\\bin;C:\\Program Files\\R\\R-3.4.1patched\\bin\\x64;C:\\Program Files\\Git\\cmd;C:\\texlive\\2017\\bin\\win32;C:\\Miniconda3\\Scripts;C:\\Miniconda3;C:\\rakudo\\bin;C:\\rakudo\\share\\perl6\\site\\bin;C:\\Program Files\\Docker Toolbox"。我还在想这是什么意思呢! - Suman Khanal
也许perl6不支持参数-e - Yihui Xie
1
Perl 6支持-e参数。我发现在我运行的Windows操作系统中,Perl 6只能使用双引号而不能使用单引号。因此,在Windows中,perl6 -e "say 'Hello' "是可行的,但perl6 -e 'say "Hello" '则不行。 - Suman Khanal
1
代码在 Windows 上应该用双引号引用(参见 shQuote)。我已经没有更多的想法了。如果你想自己调试这个问题,可以看一下 https://github.com/yihui/knitr/blob/master/R/engine.R 中的 eng_interpreted 函数。 - Yihui Xie
显示剩余3条评论

1

在Windows的命令提示符中,这样做:

perl6 -e "say 'hello'"

but this fails:

perl6 -e 'say "hello"'

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


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