Home

Awesome

<!-- README.md is generated from README.Rmd. Please edit that file -->

simplec - demo package for calling C code with .C()

<!-- badges: start -->

<!-- badges: end -->

simplec is a small demo package showing how C code could be included in a package and called with .C()

In general: Consider using .Call() or Rcpp instead of .C()

This is one of a series of small demo packages for
calling other languages from R:

Rough comparison of .C(), .Call(), {Rcpp} (and .Fortran())

.C().Call()Rcpp
OverviewNo real understanding of R objectsNeed to understand SEXP macros & internalsC++ classes hide the complexity of the SEXP internals
What code?Basic C code. Numeric calcs.Complex C code. Can manipulate R objects from CComplex C and C++ code involving numerics and R objects
ProsSimple to understand and useSimple. No unnecessary copying.Great documentation. Wrapping of R objects very intuitive.
ConsToo simple for most interesting thingsNeed to understand SEXP & R internals
ConsPerforms copying of data to call functions
Demo R package{simplec}{simplecall}{simplercpp}
Compiled size17 kB17 kB92 kB (stripping can bring this down: see issue1)
.Fortran()
OverviewNo real understanding of R objects
What code?Basic Fortran code. Numeric calcs.
ProsSimple to understand and use
ConsToo simple for most interesting things
ConsPerforms copying of data to call functions
ConsNeed to know Fortran!
Demo R package{simplefortran}
Compiled size17 kB
                         |

Installation

You can install from GitHub with:

# install.package('remotes')
remotes::install_github('coolbutuseless/simplec)

What’s in the box?

Package contains 2 C functions, and 2 functions in R which call the C functions using .C().

C functionR function
add_(double *x, double *y, double *res)add_C(x, y)
mul_(double *x, double *y, double *res)mul_C(x, y)

What’s in the R functions?

<!-- end list -->
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#' Add two numbers
#'
#' @param x,y numbers to add
#'
#' @useDynLib simplec add_
#' @export
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
add_C <- function(x, y) {
  .C(add_, x, y, numeric(1))[[3]]
}

What’s in the C functions?

<!-- end list -->
void add_(double* x, double* y, double* res) {
  res[0] = x[0] + y[0];
}

How do R variables map to C variables?

RC
logicalint *
integerint *
doubledouble *
complexRcomplex *
characterchar **
rawunsigned char *

What does the C function look like in R?

<!-- end list -->
simplec:::add_
#> $name
#> [1] "add_"
#> 
#> $address
#> <pointer: 0x7f9780cb1c30>
#> attr(,"class")
#> [1] "RegisteredNativeSymbol"
#> 
#> $dll
#> DLL name: simplec
#> Filename:
#>         /Library/Frameworks/R.framework/Versions/4.0/Resources/library/simplec/libs/simplec.so
#> Dynamic lookup: FALSE
#> 
#> $numParameters
#> [1] 3
#> 
#> attr(,"class")
#> [1] "CRoutine"         "NativeSymbolInfo"

Resources

Acknowledgements