2016-04-02 14 views
0

Rcpp packgae kullanarak bir R işlevi içinde çağrılan bir C++ işlevim var. R işlevi bir inputDataFrame kabul eder ve zamanla bir işlev olarak (A1) ilaç miktarlarını hesaplamak için C++ işlevini (ayrıca bir DataFrame'i de kabul eder) kullanır. R, A1 hesaplanan miktarları için eklenen sütun ile inputDataFrame döndürür.R/C++ işlevlerini kullanarak Rpackage oluştururken sorun mu yaşıyorsunuz?

Bu işlev için bir Rpackage yapmayla ilgili sorun yaşıyorum. RStudio instruction'u izledim, ancak paketi oluştururken bir hatayla karşılaştım. Hata, RcppExport.cpp dosyasında ve 'OneCompIVbolusCpp' was not declared in this scope olduğunu belirtir.

C++ ve R işlevlerinin kodları aşağıda verilmiştir. Örnek bir veri şemasını işlediğimde R'de gayet iyi çalışıyorlar.

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++ işlevi OneCompIVbolusCppfunction.cpp: burada yanlış yapıyorum ne

#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); 
} 

Herhangi bir ipuçları? Bu sorunu nasıl çözebilirim?

Düzenleme: Sadece yanlış sipariş olabilir

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) 
+0

Paketine github bağlantısı mebbe? – hrbrmstr

+0

@hrbrmstr nasıl? – Amer

cevap

1

: Burada

Ar kompozit fonksiyonunu OneCompIVbolusRCpp çalışan bir örnektir. Bunun yerine

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

ait onu ihracat fonksiyonu önce doğrudan gelmelidir [[Rcpp::export]] etiketi olarak

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

yapmak.

+0

Evet! teşekkür ederim! Mümkünse başka bir sorum var. Rcpp kullanan R paketleri için 'roxygen2' paketini kullanamıyorum gibi görünmüyor mu? Benimle çalışmadı, ama * * .R' dosyaları olarak işlevim olduğunda iyi çalışırım? – Amer

+0

Evet yapabilirsin! C++ işlevine roxygen2 malzeme ekle, bu roxygen2'nin üstesinden geldiği R dosyasına taşınacak mı? –

+0

Cpp işlev koduna bir miktar roxygen yorumu eklemeyi denedim, ancak çalışmadı. Düzgün bir şey eksik mi? – Amer

İlgili konular