当前位置:  开发笔记 > 编程语言 > 正文

Rcpp将长度为0(NULL)的向量传递给cppfunction

如何解决《Rcpp将长度为0(NULL)的向量传递给cppfunction》经验,为你挑选了1个好方法。

我有一个cppFunction矢量ints作为输入,例如:

library(Rcpp)
cppFunction('double test2(NumericVector ints) {
            return 42;
            }')

如果传递长度至少为1的向量,则输出正确:

> test2(1)
[1] 42
> test2(1:10)
[1] 42

对于长度为0的输入,我得到:

> test2(c())
Error: not compatible with requested type

有没有办法将长度为0或更大的向量传递给我的函数?即我的预期输出是:

> test2_expectedoutput(c())
[1] 42

我知道我可以通过首先检入R并调用函数的不同版本来控制R,但是我想避免这种情况.我希望有一些简单的解决方案,因为在cpp内我也可以有一个NumericVector长度为0,如果我正确理解是什么NumericVector zero;.唯一相关的问题我能找到的这个关于如何从RCPP功能R内部返回NULL对象.



1> Dirk Eddelbu..:

几个月前,我们添加了传递的能力,Nullable这可能是你想要的.

这是一个简单的例子:

#include 

using namespace Rcpp;

// [[Rcpp::export]]
bool checkNull(Nullable x) {
  if (x.isNotNull()) {
    // do something
    NumericVector xx(x);
    Rcpp::Rcout << "Sum is " << sum(xx) << std::endl;
    return true;
  } else {
    // do nothing
    Rcpp::Rcout << "Nothing to see" << std::endl;
    return false;
  }
}

/*** R
checkNull(1:3)
checkNull(NULL)
*/

及其输出:

R> sourceCpp("/tmp/null.cpp")

R> checkNull(1:3)
Sum is 6
[1] TRUE

R> checkNull(NULL)
Nothing to see
[1] FALSE
R> 

通过模仿,我们尊重预期的类型,但明确区分存在与否.


(我不是建议/要求你这样做但是......)人们一直在接受投票.SO的重点是让最佳解决方案泡沫化.选择最能回答您问题的答案.这就是优点系统的运作方式.
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有