An 'Rcpp' Interface to Active Bindings

Provides an easy way to fill an environment with active bindings that call a C++ function.

Travis-CI Build Status AppVeyor Build Status CRAN_Status_Badge

It's easy to create active bindings in R via makeActiveBinding(). This package faciliates the creation of active bindings that link back to C++ code. It provides an interface that allows binding several identifiers in an environment to the same C++ function, which is then called with the name (and a payload) as argument.

It is recommended to use the newer _wrapped functions that support passing an arbitrary Rcpp::List as payload. This allows to store an Rcpp::XPtr to a C++ object in that list. The XPtr then will be released when the payload is garbage-collected, and the C++ object will be destroyed.


You can install bindrcpp from github with:



The following C++ module exports a function test_tolower_bindings() that creates active bindings that return the binding name in lowercase.

#include <Rcpp.h>
// [[Rcpp::depends(bindrcpp)]] 
#include <bindrcpp.h>
#include <algorithm>
#include <string>
using namespace Rcpp;
using namespace bindrcpp;
SEXP tolower_callback(const String& name, PAYLOAD) {
  std::string name_string = name;
  std::transform(name_string.begin(), name_string.end(), name_string.begin(), ::tolower);
  return CharacterVector(name_string);
// [[Rcpp::export]] 
SEXP test_tolower_bindings(CharacterVector names, Environment parent) {
  // We don't pass any payload here 
  return bindrcpp::create_env_string(
    names, &tolower_callback, PAYLOAD(NULL), parent);

This function can be called from R:

env <- test_tolower_bindings(c("Converting", "to", "LOWERCASE"), .GlobalEnv)
#> [1] "Converting" "LOWERCASE"  "to"
#> [1] "converting"
#> [1] "to"
#> [1] "lowercase"

The bindings are read-only:

env$Converting <- "CONVERTING"
#> Error: Binding is read-only.


bindrcpp 0.2.2 (2018-03-29)

  • Fix compatibility with dplyr installed and built against an older version of bindrcpp.
  • Support callbacks that accept a list. The new xxx_env_yyy_wrapped() functions expect a list as payload, and a callback function with List instead of PAYLOAD as second argument. This helps controlling the lifetime of objects associated with a callback: these can be placed in an XPtr inside the List. The xxx_env_yyy() functions have been aliased to xxx_env_yyy_typed() (#7).
  • Bump dependency to bindr 0.1.1.

bindrcpp 0.2 (2017-06-15)

  • Fixed very rare segmentation fault due to missing protection of function arguments in autogenerated boilerplate code.
  • Fix compilation errors on FreeBSD due to use of nonstandard Make features (#5).
  • Native symbol registration added by Rcpp.

bindrcpp 0.1 (2016-12-08)

Initial CRAN release.

Exported C++ functions

  • create_env_string() creates an environment with active bindings, with names given as a character vector. Access of these bindings triggers a call to a C++ function with a fixed signature (GETTER_FUNC_STRING); this call contains the name of the binding (as character) and an arbitrary payload (PAYLOAD, essentially a wrapped void*).
  • create_env_symbol() is similar, the callback function accepts the name of the binding as symbol instead of character (GETTER_FUNC_SYMBOL).
  • populate_env_string() and populate_env_symbol() populate an existing environment instead of creating a new one.
  • Use LinkingTo: bindrcpp and #include <bindrcpp.h> to access these functions from your package.

Exported R functions

  • Reexported from bindr: create_env() and populate_env().

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.


0.2.2 by Kirill Müller, 4 years ago,

Report a bug at

Browse source code at

Authors: Kirill Müller [aut, cre] , RStudio [cph]

Documentation:   PDF Manual  

MIT + file LICENSE license

Imports bindr, Rcpp

Suggests testthat

Linking to plogr, Rcpp

Suggested by coxed, joineRML, tidybayes, waydown.

See at CRAN