Description Usage Format Details Note References Examples
This object controls how to execute the code from languages other than R
(when the chunk option engine
is not 'R'
). Each component in
this object is a function that takes a list of current chunk options
(including the source code) and returns a character string to be written into
the output.
1 |
An object of class list
of length 6.
The engine function has one argument options
: the source code of the
current chunk is in options$code
. Usually we can call external
programs to run the code via system2
. Other chunk options are
also contained in this argument, e.g. options$echo
and
options$eval
, etc.
In most cases, options$engine
can be directly used in command line to
execute the code, e.g. python
or ruby
, but sometimes we may
want to specify the path of the engine program, in which case we can pass it
through the engine.path
option. For example, engine='ruby',
engine.path='/usr/bin/ruby1.9.1'
. Additional command line arguments can be
passed through options$engine.opts
, e.g. engine='ruby',
engine.opts='-v'
.
See str(knitr::knit_engines$get())
for a list of built-in language
engines.
The Leiningen engine lein
requires lein-exec plugin; see
https://github.com/yihui/knitr/issues/1176 for details.
Usage: https://yihui.org/knitr/objects/; examples: https://yihui.org/knitr/demo/engines/
1 2 3 | knit_engines$get("python")
knit_engines$get("awk")
names(knit_engines$get())
|
function (options)
{
engine = options$engine
code = if (engine %in% c("highlight", "Rscript", "sas", "haskell",
"stata")) {
f = basename(tempfile(engine, ".", switch(engine, sas = ".sas",
Rscript = ".R", stata = ".do", ".txt")))
writeLines(c(switch(engine, sas = "OPTIONS NONUMBER NODATE PAGESIZE = MAX FORMCHAR = '|----|+|---+=|-/<>*' FORMDLIM=' ';title;",
NULL), options$code), f)
on.exit(unlink(f), add = TRUE)
switch(engine, haskell = paste("-e", shQuote(paste(":script",
f))), sas = {
logf = sub("[.]sas$", ".lst", f)
on.exit(unlink(c(logf, sub("[.]sas$", ".log", f))),
add = TRUE)
f
}, stata = {
logf = sub("[.]do$", ".log", f)
on.exit(unlink(c(logf)), add = TRUE)
paste(switch(Sys.info()[["sysname"]], Windows = "/q /e do",
Darwin = "-q -e do", Linux = "-q -b do", "-q -b do"),
shQuote(normalizePath(f)))
}, f)
}
else paste(switch(engine, bash = "-c", coffee = "-e", groovy = "-e",
lein = "exec -e", mysql = "-e", node = "-e", octave = "--eval",
perl = "-e", psql = "-c", python = "-c", ruby = "-e",
scala = "-e", sh = "-c", zsh = "-c", NULL), shQuote(paste(options$code,
collapse = "\n")))
code = if (engine %in% c("awk", "gawk", "sed", "sas"))
paste(code, options$engine.opts)
else paste(options$engine.opts, code)
cmd = get_engine_path(options$engine.path, engine)
out = if (options$eval) {
message("running: ", cmd, " ", code)
tryCatch(system2(cmd, code, stdout = TRUE, stderr = TRUE,
env = options$engine.env), error = function(e) {
if (!options$error)
stop(e)
paste("Error in running command", cmd)
})
}
else ""
if (!options$error && !is.null(attr(out, "status")))
stop(paste(out, collapse = "\n"))
if (options$eval && engine %in% c("sas", "stata") && file.exists(logf))
out = c(readLines(logf), out)
engine_output(options, options$code, out)
}
<environment: namespace:knitr>
function (options)
{
engine = options$engine
code = if (engine %in% c("highlight", "Rscript", "sas", "haskell",
"stata")) {
f = basename(tempfile(engine, ".", switch(engine, sas = ".sas",
Rscript = ".R", stata = ".do", ".txt")))
writeLines(c(switch(engine, sas = "OPTIONS NONUMBER NODATE PAGESIZE = MAX FORMCHAR = '|----|+|---+=|-/<>*' FORMDLIM=' ';title;",
NULL), options$code), f)
on.exit(unlink(f), add = TRUE)
switch(engine, haskell = paste("-e", shQuote(paste(":script",
f))), sas = {
logf = sub("[.]sas$", ".lst", f)
on.exit(unlink(c(logf, sub("[.]sas$", ".log", f))),
add = TRUE)
f
}, stata = {
logf = sub("[.]do$", ".log", f)
on.exit(unlink(c(logf)), add = TRUE)
paste(switch(Sys.info()[["sysname"]], Windows = "/q /e do",
Darwin = "-q -e do", Linux = "-q -b do", "-q -b do"),
shQuote(normalizePath(f)))
}, f)
}
else paste(switch(engine, bash = "-c", coffee = "-e", groovy = "-e",
lein = "exec -e", mysql = "-e", node = "-e", octave = "--eval",
perl = "-e", psql = "-c", python = "-c", ruby = "-e",
scala = "-e", sh = "-c", zsh = "-c", NULL), shQuote(paste(options$code,
collapse = "\n")))
code = if (engine %in% c("awk", "gawk", "sed", "sas"))
paste(code, options$engine.opts)
else paste(options$engine.opts, code)
cmd = get_engine_path(options$engine.path, engine)
out = if (options$eval) {
message("running: ", cmd, " ", code)
tryCatch(system2(cmd, code, stdout = TRUE, stderr = TRUE,
env = options$engine.env), error = function(e) {
if (!options$error)
stop(e)
paste("Error in running command", cmd)
})
}
else ""
if (!options$error && !is.null(attr(out, "status")))
stop(paste(out, collapse = "\n"))
if (options$eval && engine %in% c("sas", "stata") && file.exists(logf))
out = c(readLines(logf), out)
engine_output(options, options$code, out)
}
<environment: namespace:knitr>
[1] "awk" "bash" "coffee" "gawk" "groovy" "haskell"
[7] "lein" "mysql" "node" "octave" "perl" "psql"
[13] "python" "Rscript" "ruby" "sas" "scala" "sed"
[19] "sh" "stata" "zsh" "highlight" "Rcpp" "tikz"
[25] "dot" "c" "fortran" "fortran95" "asy" "cat"
[31] "asis" "stan" "block" "block2" "js" "css"
[37] "sql" "go"
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.