cpp_source() compiles and loads a single C++ file for use in R.
cpp_function() compiles and loads a single function for use in R.
cpp_eval() evaluates a single C++ expression and returns the result.
cpp_source(
file,
code = NULL,
env = parent.frame(),
clean = TRUE,
quiet = TRUE,
cxx_std = Sys.getenv("CXX_STD", "CXX11"),
dir = tempfile()
)
cpp_function(
code,
env = parent.frame(),
clean = TRUE,
quiet = TRUE,
cxx_std = Sys.getenv("CXX_STD", "CXX11")
)
cpp_eval(
code,
env = parent.frame(),
clean = TRUE,
quiet = TRUE,
cxx_std = Sys.getenv("CXX_STD", "CXX11")
)A file containing C++ code to compile
If non-null, the C++ code to compile
The R environment where the R wrapping functions should be defined.
If TRUE, cleanup the files after sourcing
If 'TRUE`, do not show compiler output
The C++ standard to use, the CXX_STD make macro is set to
this value. The default value queries the CXX_STD environment variable, or
uses 'CXX11' if unset.
The directory to store the generated source files. tempfile() is
used by default. The directory will be removed if clean is TRUE.
For cpp_source() and [cpp_function()] the results of
dyn.load() (invisibly). For [cpp_eval()] the results of the evaluated
expression.
Within C++ code you can use [[cpp11::linking_to("pkgxyz")]] to link to
external packages. This is equivalent to putting those packages in the
LinkingTo field in a package DESCRIPTION.
cpp_source(
code = '#include "cpp11/integers.hpp"
[[cpp11::register]]
int num_odd(cpp11::integers x) {
int total = 0;
for (int val : x) {
if ((val % 2) == 1) {
++total;
}
}
return total;
}
')
num_odd(as.integer(c(1:10, 15, 23)))
#> [1] 7
if (interactive() && require("progress")) {
cpp_source(
code = '
#include <cpp11/R.hpp>
#include <RProgress.h>
[[cpp11::linking_to("progress")]]
[[cpp11::register]] void
show_progress() {
RProgress::RProgress pb("Processing [:bar] ETA: :eta");
pb.tick(0);
for (int i = 0; i < 100; i++) {
usleep(2.0 / 100 * 1000000);
pb.tick();
}
}
')
show_progress()
}