如何将参数传递到 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"
我对使用 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"