【问题标题】:Executing Perl 6 code in Rmarkdown在 Rmarkdown 中执行 Perl 6 代码
【发布时间】:2017-08-24 09:30:46
【问题描述】:

我想写一些关于 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 输出。

在我失踪的地方有什么帮助吗?

【问题讨论】:

    标签: r perl knitr r-markdown raku


    【解决方案1】:

    不是我的专业领域,但通过 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 编译器,要求它编译该文件。

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

    【讨论】:

    • 随时!不要忘记在我们的 IRC 支持频道上提及您的教程,以便更多人了解它们:)
    【解决方案2】:

    您的示例中有两个问题。首先,我认为您仍然可以使用现有的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'
    ))
    ```
    

    【讨论】:

    • 我尝试了你的第一个帮助。它不工作。这是我得到的错误: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: &lt;Anonymous&gt; ... tryCatch -&gt; tryCatchList -&gt; tryCatchOne -&gt; &lt;Anonymous&gt; Execution halted 。即使是第二种解决方案也不起作用。可能出了什么问题?
    • 如果您的 perl6.exe 在您的PATH 变量中,只需设置engine.path="perl6";否则你需要perl6.exe的实际路径,你没有说,我只是从你的例子中推断出来的。
    • PATH 设置为engine.path="perl6" 仍然没有给出输出,尽管它不会引发错误。稍微深入了解一下,Perl 6 的bin 文件夹中有perl6.bat。那么这个.bat 而不是.exe 文件有问题吗?
    • Perl 6 确实支持 -e 参数。我发现 Perl 6 在我正在运行的 Windows 操作系统中使用双引号而不是单引号。所以perl6 -e "say 'Hello' " 在 Windows 中有效,但 perl6 -e 'say "Hello" ' 不会。
    • 代码在 Windows 上应该用双引号引起来(参见shQuote)。我已经没有想法了。如果你想自己调试这个问题,你可以看看github.com/yihui/knitr/blob/master/R/engine.R中的函数eng_interpreted
    【解决方案3】:

    在 Windows 上的命令提示符下,这是可行的:

    perl6 -e "say 'hello'"
    

    但这失败了:

    perl6 -e 'say "hello"'
    

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

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多