r - r 使用 rcpp 时中止
问题描述
我正在编写一些代码,运行时,它中止了。r 版本是 3.5.1。我认为我的 rcpp 代码有问题,但我找不到。它只是显示 R 会话中止。
################我认为这部分没有任何问题。#include <Rcpp.h>
Rcpp::LogicalVector logical_index(Rcpp::IntegerVector idx, R_xlen_t n) {
bool invert = false;
Rcpp::LogicalVector result(n, false);
for (R_xlen_t i = 0; i < idx.size(); i++) {
if (!invert && idx[i] < 0) invert = true;
result[std::abs(idx[i])] = true;
}
if (!invert) return result;
return !result;
}
// [[Rcpp::export]]
Rcpp::NumericVector
Subset(Rcpp::NumericVector x, Rcpp::IntegerVector idx) {
return x[logical_index(idx, x.size())];
}
# ################这部分可能有问题。
library(Rcpp)
library(gRbase)
vec=0:13
a=combnPrim(vec,4)
cppFunction("
NumericVector r_test(NumericMatrix a, Function comp, Function fct,Function
tempf, Function combnPrim, NumericVector Fv, NumericVector vec, Function
Subset){
NumericVector if1(4);
NumericVector if2(2);
NumericVector if3(4);
NumericVector if4(4);
NumericVector seq(14);
NumericMatrix b(2,45);
NumericMatrix c(4,70);
for (int i1=0; i1<=a.ncol()-1; i1++){
if1=a (_, i1);
b=combnPrim(Subset(vec,-(if1)),2);
for (int i2=0; i2<=b.ncol()-1; i2++){
if2=b (_, i2);
c=combnPrim(Subset(Subset(vec,-(if1)),-(if2)),4);
for (int i3=0; i3<=c.ncol()-1; i3++){
if3=c (_, i3);
if4=Subset(Subset(Subset(vec,-(if1)),-(if2)),-(if3));
seq=tempf(if1,if2,if3,if4);
}}}return if1;}")
Fv=7.001327
setwd("D:/STAT 602")
sourceCpp("Subset.cpp")
fct=function(seq,data,fact){
return(anova(lm(data[seq]~as.factor(fact)))$`F value`[1])
}
tempf=function(x1,x2,x3,x4){
return(c(x1,x2,x3,x4))
}
comp=function(x,y){
return(x>y)
}
r_test(a,comp, fct, tempf, combnPrim, Fv, vec, Subset)
#
combnPrim 用于查找向量的所有组合,并输出一个矩阵,Subset 与vector[-i] 的用途相同。单独来说,所有函数都可以在 cppFunction 中很好地发挥作用,但是当这样放置它们时,就会出错。
解决方案
由于这段代码非常复杂,我不打算寻找确切的、特定的错误。但是,我可以确认@RalfStubner 是正确的,您的问题是您正在尝试访问不存在的向量元素。
如果您更改logical_index()
为
LogicalVector logical_index(IntegerVector idx, R_xlen_t n) {
bool invert = false;
LogicalVector result(n, false);
for (R_xlen_t i = 0; i < idx.size(); i++) {
if (!invert && idx(i) < 0) invert = true;
result(std::abs(idx(i))) = true;
}
if (!invert) return result;
return !result;
}
因此元素访问是通过()
而不是[]
确保边界检查来完成的,1而不仅仅是中止,我看到以下内容:
r_test(a,comp, fct, tempf, combnPrim, Fv, vec, Subset)
r_test(a, comp, fct, tempf, combnPrim, Fv, vec, Subset)
中的错误:评估错误:索引越界:[index=10; 范围=8]..
这意味着您正在尝试访问不存在的向量的元素。我也可以告诉你发生这种情况的基本原因:在logical_vector()
中,当一个元素idx
大于时n
,就会发生这种情况。因此,在 中的某个时刻r_test()
,您正在调用Subset()
具有idx
大于 的元素x.size()
。
()
1 你是对的,当一个向量被另一个向量子集时,你会得到一个错误尝试用于向量子集。但是,这在访问向量的一个元素时有效。
推荐阅读
- python - Tensorflow/Keras:计算中间层输出时出错
- python - 为什么我不能添加或减去两个日期时间?
- android - Genymotion 卡在启动屏幕上
- c# - 如何将错误气泡消息绑定到 WPF 中的 TextBox?
- python - 0 未在 while 语句中注册为数字
- pandas - 如何按列表中的值对数据框进行排序
- c++ - 哪个版本的 Visual Studio 中引入了函数?
- c# - 未注册 UserIdentity 类型的服务
- javascript - 如何结合范围滑块清空输入字段?
- android - Google Pay API - 在没有 JWT 的情况下向 Google Pay 应用程序插入通行证