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)
Paketine github bağlantısı mebbe? – hrbrmstr
@hrbrmstr nasıl? – Amer