首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rcpp数据Rcpp不能上下文转换为bool

Rcpp数据Rcpp不能上下文转换为bool
EN

Stack Overflow用户
提问于 2015-09-23 20:22:44
回答 1查看 428关注 0票数 1

当使用dataframes (来自Rcpp)时,通常如何处理默认值?

以下是我所尝试的:

代码语言:javascript
复制
// [[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有更多了解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 22:43:17

有几个语法问题值得在您的代码中指出。首先,NULL比R中有一个非常C/C++中的不同含义 --不要像上面那样使用它。您可以在Rcpp代码中使用R_NilValue来表示R的NULL。此外,您的函数参数没有正确声明。从语法上讲,这句话-

代码语言:javascript
复制
Rcpp::DataFrame(masslist)

是在(大概)另一个名为DataFrameDataFrame对象上调用masslist类的构造函数/复制构造函数,但这不是您想要的,它无论如何也不会编译。您的函数签名(广义地说)需要更类似于

ReturnType function_name(ParamType1 param1, ParamType2 param2, ...)

或者,使用默认参数,

ReturnType function_name(ParamType1 param1 = p1, ParamType2 param2 = p2, ...)

其中p1p2是实际值,而不是变量。

在您的例子中,我认为编写没有默认参数的Rcpp函数并从R中指定默认值的简单包装函数调用它要简单得多。例如,

代码语言:javascript
复制
#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++中处理这个问题,您可以这样做:

代码语言:javascript
复制
#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"];,但前一种方法感觉更有条理一些。无论如何,如果有可能,我强烈建议采取第一种方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32748796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档