R和Rcpp代码的等价性测试
Equivalence testing of R and Rcpp code
我有一些 C++ 代码要通过 Rcpp 与 R 集成。
我的问题是:
Rcpp 中是否有一个函数可以逻辑输出 C++ 代码块是否与 R 代码块相同,也许等同于 identical() 或 all.equal(),它们是均在 R 中实现?
在 R 中,identical() 和 all.equal() 都需要两个 R 对象进行比较。在我的例子中,一个对象是 R 代码,另一个是 C++ 代码。
我在 Rcpp 文档中找不到任何内容。
我想你可能遇到了森林和树木问题。
归根结底,这真的只是(在一个简化的模拟示例中):
#include <Rcpp.h>
// [[Rcpp::export]]
double csCpp(Rcpp::NumericVector x) {
return Rcpp::sum(x);
}
/*** R
csR <- function(x) sum(x)
set.seed(42)
x <- rnorm(100)
all.equal(csR(x), csCpp(x))
*/
结果不出所料:
R> Rcpp::sourceCpp("/tmp/soQ.cpp")
R> csR <- function(x) sum(x)
R> set.seed(42)
R> x <- rnorm(100)
R> all.equal(csR(x), csCpp(x))
[1] TRUE
R>
但是由于您无法仅用一个输入来证明所有输入的正确性,您又要为不同的(代表性的)输入设计合适的单元测试。
我有一些 C++ 代码要通过 Rcpp 与 R 集成。
我的问题是:
Rcpp 中是否有一个函数可以逻辑输出 C++ 代码块是否与 R 代码块相同,也许等同于 identical() 或 all.equal(),它们是均在 R 中实现?
在 R 中,identical() 和 all.equal() 都需要两个 R 对象进行比较。在我的例子中,一个对象是 R 代码,另一个是 C++ 代码。
我在 Rcpp 文档中找不到任何内容。
我想你可能遇到了森林和树木问题。
归根结底,这真的只是(在一个简化的模拟示例中):
#include <Rcpp.h>
// [[Rcpp::export]]
double csCpp(Rcpp::NumericVector x) {
return Rcpp::sum(x);
}
/*** R
csR <- function(x) sum(x)
set.seed(42)
x <- rnorm(100)
all.equal(csR(x), csCpp(x))
*/
结果不出所料:
R> Rcpp::sourceCpp("/tmp/soQ.cpp")
R> csR <- function(x) sum(x)
R> set.seed(42)
R> x <- rnorm(100)
R> all.equal(csR(x), csCpp(x))
[1] TRUE
R>
但是由于您无法仅用一个输入来证明所有输入的正确性,您又要为不同的(代表性的)输入设计合适的单元测试。