Выполнение кода Perl 6 в Rmarkdown

Я хочу написать несколько руководств по Perl 6. Для этого я считаю, что Rmarkdown будет очень полезен.

Итак, я пытаюсь выполнить код Perl 6 в документе Rmarkdown.

Мой исполняемый файл 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. введите описание изображения здесь

Любая помощь, где мне не хватает?

Ответ 1

Не моя область знаний, но с помощью справки в блоге Мне удалось получить ее для вывода.

Сначала зайдите на вкладку 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, прося его скомпилировать этот файл.

После сбора необходимого результата функция удаляет временный файл и дает нам вывод для рендеринга.

Ответ 2

У вас было две проблемы в вашем примере. Во-первых, я думаю, что вы все еще можете использовать существующий движок 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'
))
```

Ответ 3

В командной строке на окнах это работает:

perl6 -e "say 'hello'"

но это не удается:

perl6 -e 'say "hello"'

Вам нужно использовать двойные кавычки для указания аргументов в командной строке.