0

I have a C++ function that is called inside an R function using Rcpp packgae. The R function accepts an inputDataFrame and uses the C++ function (also accepts a DataFrame) to calculate drug amounts (A1) as a function with time. R then returns the inputDataFrame with added column for the calculated amounts A1.

I have trouble making an Rpackage for this function. I followed RStudio instruction but I ran into an error when building the package. The error is in the RcppExport.cpp file and states that 'OneCompIVbolusCpp' was not declared in this scope.

Here are the codes for the C++ and R functions. They work perfectly fine in R when I process an example dataframe.

Rfunction OneCompIVbolus_Rfunction.R:

library(Rcpp)
sourceCpp("OneCompIVbolusCppfunction.cpp")

OneCompIVbolusRCpp <- function(inputDataFrame){

  inputDataFrame$A1[inputDataFrame$TIME==0] <- inputDataFrame$AMT[inputDataFrame$TIME==0]
  OneCompIVbolusCpp( inputDataFrame )

  inputDataFrame
}

C++ function OneCompIVbolusCppfunction.cpp:

#include <Rcpp.h>
#include <math.h>
#include <iostream>
using namespace Rcpp;
using namespace std;

// [[Rcpp::export]]
// input Dataframe from R
DataFrame OneCompIVbolusCpp(DataFrame inputFrame){

  //  Create vectors of each element used in function and for constructing output dataframe
  Rcpp::DoubleVector TIME = inputFrame["TIME"];
  Rcpp::DoubleVector AMT = inputFrame["AMT"];
  Rcpp::DoubleVector k10 = inputFrame["k10"];
  Rcpp::DoubleVector A1 = inputFrame["A1"];

  double currentk10, currentTime, previousA1, currentA1;

  // in C++ arrays start at index 0, so to start at 2nd row need to set counter to 1
  // for counter from 1 to the number of rows in input data frame
  for(int counter = 1; counter < inputFrame.nrows(); counter++){
  // pull out all the variables that will be used for calculation
    currentk10  = k10[ counter ];
    currentTime = TIME[ counter ] - TIME[ counter - 1];
    previousA1  = A1[ counter - 1 ];

    // Calculate currentA1
    currentA1 = previousA1*exp(-currentTime*currentk10);

    // Fill in Amounts and check for other doses
    A1[ counter ] = currentA1 + AMT[ counter ];

  } // end for loop
  return(0);
}

Any hints on what am I doing wrong here? How may I solve this issue?

Edit:

Here is an example of running the composite function OneCompIVbolusRCpp in R:

library(plyr)
library(Rcpp)

source("OneCompIVbolus_Rfunction.R")

#-------------
# Generate df 
#-------------
#Set dose records:
dosetimes <- c(0,12)
#set number of subjects
ID <- 1:2
#Make dataframe
df <- expand.grid("ID"=ID,"TIME"=sort(unique(c(seq(0,24,1),dosetimes))),"AMT"=0,"MDV"=0,"CL"=2,"V"=10)
doserows <- subset(df, TIME%in%dosetimes)
#Dose = 100 mg, Dose 1  at time 0
doserows$AMT[doserows$TIME==dosetimes[1]] <- 100
#Dose 2 at 12
doserows$AMT[doserows$TIME==dosetimes[2]] <- 50
#Add back dose information
df <- rbind(df,doserows)
df <- df[order(df$ID,df$TIME,df$AMT),]       # arrange df by TIME (ascending) and by AMT (descending)
df <- subset(df, (TIME==0 & AMT==0)==F) # remove the row that has a TIME=0 and AMT=0
df$k10 <- df$CL/df$V
#-------------
# Apply the function 
#-------------
simdf <- ddply(df, .(ID), OneCompIVbolusRCpp)
Amer
  • 2,131
  • 3
  • 23
  • 38

1 Answers1

1

You may simply have the wrong ordering. Instead of

// [[Rcpp::export]]
// input Dataframe from R
DataFrame OneCompIVbolusCpp(DataFrame inputFrame){
   // ...

do

// input Dataframe from R
// [[Rcpp::export]]
DataFrame OneCompIVbolusCpp(DataFrame inputFrame){
   // ...

as the [[Rcpp::export]] tag must come directly before the function it exports.

Dirk Eddelbuettel
  • 360,940
  • 56
  • 644
  • 725
  • Yep! thank you! I have another question if possible. It doesn't seem that I can use the `roxygen2` package for R packages that uses Rcpp? It didn't work with me but I works fine when I have my function as `*.R` files? – Amer Apr 04 '16 at 01:14
  • Yes you can! Add roxygen2 stuff to the C++ function, this will get carried into the R file where roxygen2 takes over? – Dirk Eddelbuettel Apr 04 '16 at 01:20
  • I tried adding some roxygen comment in the Cpp function code but it didn't work. Properly missing something? – Amer Apr 04 '16 at 02:42
  • Here is something I committed [just today](https://github.com/eddelbuettel/rcppapt/blob/master/src/buildDepends.cpp#L30-L47). – Dirk Eddelbuettel Apr 04 '16 at 03:06