当使用dataframes (来自Rcpp)时,通常如何处理默认值?
以下是我所尝试的:
// [[Rcpp::export]]
Rcpp::DataFrame FindFormula(Rcpp::DataFrame(masslist),Rcpp::DataFrame(params)=NULL
,Rcpp::DataFrame(isotope)=NULL) {
// access masslist by column
Rcpp::NumericVector mass = masslist["exp mass"];
Rcpp::IntegerVector mag = masslist["intensity"];
// default params, if no entry
if (params==NULL)
{
// access params by column
Rcpp::StringVector param = params["value"];
// assign param variables (string to value)
double tol = std::stod(param[0]);
int charge = std::stoi(param[1]);
}
else
{
// default params
double tol = 0.4;
int charge = 0;
}params==NULL表达式是我获得错误的地方。如果我将params定义为int或数组,这似乎是可行的。我写的C++不多,而且对Rcpp还不熟悉,所以我很感激任何人对dataframe有更多了解。
发布于 2015-09-23 22:43:17
有几个语法问题值得在您的代码中指出。首先,NULL比R中有一个非常C/C++中的不同含义 --不要像上面那样使用它。您可以在Rcpp代码中使用R_NilValue来表示R的NULL。此外,您的函数参数没有正确声明。从语法上讲,这句话-
Rcpp::DataFrame(masslist)是在(大概)另一个名为DataFrame的DataFrame对象上调用masslist类的构造函数/复制构造函数,但这不是您想要的,它无论如何也不会编译。您的函数签名(广义地说)需要更类似于
ReturnType function_name(ParamType1 param1, ParamType2 param2, ...)
或者,使用默认参数,
ReturnType function_name(ParamType1 param1 = p1, ParamType2 param2 = p2, ...)
其中p1和p2是实际值,而不是变量。
在您的例子中,我认为编写没有默认参数的Rcpp函数并从R中指定默认值的简单包装函数调用它要简单得多。例如,
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::DataFrame FindFormulaCpp(Rcpp::DataFrame masslist_,
Rcpp::DataFrame params_,
Rcpp::DataFrame isotope_) {
// do whatever
return Rcpp::DataFrame::create(Rcpp::Named("Result") = Rcpp::rnorm(5));
}
/*** R
masslist <- data.frame(x = 1:5, y = 6:10)
params <- data.frame(a = rnorm(5), b = 1:5)
isotope <- data.frame(e = letters[1:5])
RFindFormula <- function(arg1 = masslist, arg2 = params, arg3 = isotope) {
FindFormulaCpp(arg1, arg2, arg3)
}
R> RFindFormula()
# Result
# 1 0.84583003
# 2 -0.65687178
# 3 -1.05891172
# 4 -0.06872972
# 5 -0.19695890
*/但是,如果您坚持从C++中处理这个问题,您可以这样做:
#include <Rcpp.h>
struct my_defaults {
Rcpp::DataFrame masslist, params, isotope;
my_defaults() {
masslist = Rcpp::Environment::global_env()["masslist"];
params = Rcpp::Environment::global_env()["params"];
isotope = Rcpp::Environment::global_env()["isotope"];
}
};
// [[Rcpp::export]]
Rcpp::DataFrame FindFormula(Rcpp::DataFrame masslist_ = R_NilValue,
Rcpp::DataFrame params_ = R_NilValue,
Rcpp::DataFrame isotope_ = R_NilValue) {
Rcpp::DataFrame masslist, params, isotope;
my_defaults defaults;
if (masslist_.size() == 0) {
masslist = defaults.masslist;
} else {
masslist = masslist_;
}
// likewise for the others
return masslist;
}没有必要像我上面所做的那样在struct中定义默认参数,您也可以调用,例如函数中的masslist = Rcpp::Environment::global_env()["masslist"];,但前一种方法感觉更有条理一些。无论如何,如果有可能,我强烈建议采取第一种方法。
https://stackoverflow.com/questions/32748796
复制相似问题