如何将参数传递到 cppFunction

How arguments are passed into a cppFunction

我对使用 Rcpp 时如何将参数传递到 cppFunction 感到困惑。特别想请问有没有人能解释一下下面代码的结果

library(Rcpp)
cppFunction("void test(double &x, NumericVector y) {
    x = 2016;
    y[0] = 2016;
}")
a = 1L
b = 1L
c = 1
d = 1
test(a,b)
test(c,d)
cat(a,b,c,d) #this prints "1 1 1 2016"

如之前在其他领域所述,Rcpp 围绕 R 的 SEXP 对象建立了方便的 类。

  • 对于第一个参数,double 类型没有默认的 SEXP 对象。这是因为在 R 中,没有标量这样的东西。因此,分配新内存使 & 引用不兼容。因此,修改的变量范围仅限于函数,并且永远不会更新结果。因此,对于这两个测试用例,您将看到 1.
  • 对于第二种情况,对象 类 之间存在不匹配。在提供的第一个调用对象中,由于在末尾附加了 L,因此类型为 integer,这与 C++ 函数期望的 numeric 类型冲突。一旦对象被实例化为 numeric,删除 L 后问题就解决了。因此,需要创建类型正确的中间内存位置 而不是 来接收值。因此,第二种情况下的修改能够传播回 R.

例如

a = 1L
class(a)
# "integer"
a = 1
class(a)
# "numeric"