rust_source()
compiles and loads a single Rust file for use in R. rust_function()
compiles and loads a single Rust function for use in R.
Usage
rust_source(
file,
code = NULL,
module_name = "rextendr",
dependencies = NULL,
patch.crates_io = getOption("rextendr.patch.crates_io"),
profile = c("dev", "release", "perf"),
toolchain = getOption("rextendr.toolchain"),
extendr_deps = NULL,
features = NULL,
env = parent.frame(),
use_extendr_api = TRUE,
generate_module_macro = TRUE,
cache_build = TRUE,
quiet = FALSE,
use_rtools = TRUE,
use_dev_extendr = FALSE
)
rust_function(
code,
extendr_fn_options = NULL,
env = parent.frame(),
quiet = FALSE,
use_dev_extendr = FALSE,
...
)
Arguments
- file
Input rust file to source.
- code
Input rust code, to be used instead of
file
.- module_name
Name of the module defined in the Rust source via
extendr_module!
. Default is"rextendr"
. Ifgenerate_module_macro
isFALSE
or iffile
is specified, should match exactly the name of the module defined in the source.- dependencies
Character vector of dependencies lines to be added to the
Cargo.toml
file.- patch.crates_io
Character vector of patch statements for crates.io to be added to the
Cargo.toml
file.- profile
Rust profile. Can be either
"dev"
,"release"
or"perf"
. The default,"dev"
, compiles faster but produces slower code.- toolchain
Rust toolchain. The default,
NULL
, compiles with the system default toolchain. Accepts valid Rust toolchain qualifiers, such as"nightly"
, or (on Windows)"stable-msvc"
.- extendr_deps
Versions of
extendr-*
crates. Defaults torextendr.extendr_deps
option (list(`extendr-api` = "*")
) ifuse_dev_extendr
is notTRUE
, otherwise, usesrextendr.extendr_dev_deps
option (list(`extendr-api` = list(git = "https://github.com/extendr/extendr")
).- features
A vector of
extendr-api
features that should be enabled. Supported values are"ndarray"
,"num-complex"
,"serde"
, and"graphics"
. Unknown features will produce a warning ifquiet
is notTRUE
.- env
The R environment in which the wrapping functions will be defined.
- use_extendr_api
Logical indicating whether
use extendr_api::prelude::*;
should be added at the top of the Rust source provided viacode
. Default isTRUE
. Ignored for Rust source provided viafile
.- generate_module_macro
Logical indicating whether the Rust module macro should be automatically generated from the code. Default is
TRUE
. Ignored for Rust source provided viafile
. The macro generation is done withmake_module_macro()
and it may fail in complex cases. If something doesn't work, try callingmake_module_macro()
on your code to see whether the generated macro code has issues.- cache_build
Logical indicating whether builds should be cached between calls to
rust_source()
.- quiet
Logical indicating whether compile output should be generated or not.
- use_rtools
Logical indicating whether to append the path to Rtools to the
PATH
variable on Windows using theRTOOLS40_HOME
environment variable (if it is set). The appended path depends on the process architecture. Does nothing on other platforms.- use_dev_extendr
Logical indicating whether to use development version of
extendr
. Has no effect ifextendr_deps
are set.- extendr_fn_options
A list of extendr function options that are inserted into
#[extendr(...)]
attribute- ...
Other parameters handed off to
rust_source()
.
Value
The result from dyn.load()
, which is an object of class DLLInfo
.
See getLoadedDLLs()
for more details.
Examples
if (FALSE) {
# creating a single rust function
rust_function("fn add(a:f64, b:f64) -> f64 { a + b }")
add(2.5, 4.7)
# creating multiple rust functions at once
code <- r"(
#[extendr]
fn hello() -> &'static str {
"Hello, world!"
}
#[extendr]
fn test( a: &str, b: i64) {
rprintln!("Data sent to Rust: {}, {}", a, b);
}
)"
rust_source(code = code)
hello()
test("a string", 42)
# use case with an external dependency: a function that converts
# markdown text to html, using the `pulldown_cmark` crate.
code <- r"(
use pulldown_cmark::{Parser, Options, html};
#[extendr]
fn md_to_html(input: &str) -> String {
let mut options = Options::empty();
options.insert(Options::ENABLE_TABLES);
let parser = Parser::new_ext(input, options);
let mut output = String::new();
html::push_html(&mut output, parser);
output
}
)"
rust_source(
code = code,
dependencies = list(`pulldown-cmark` = "0.8")
)
md_text <- "# The story of the fox
The quick brown fox **jumps over** the lazy dog.
The quick *brown fox* jumps over the lazy dog."
md_to_html(md_text)
}