Rcpp 在不打印空行时产生不同的输出
Rcpp produces different output when not printing blank line
我正在尝试编写一个函数,它接受一个由 0 和 1 组成的向量(输入),returns 是一个等于第一个向量的向量,但如果前面有任何元素,每个元素都会被 0 覆盖为 0(水库)。第一个元素默认为 1。为此,对于每个 i,我 return 输入向量的第 i 个元素的最小值和先前的结果 (prev_res).
当我 运行 我的函数得到了错误的输出(正是输入),但是当我调用 std::cout
来打印一个空行时,我得到了预期的结果。这看起来很奇怪!
我附上了下面的代码。
library(Rcpp)
cppFunction(
'NumericVector any_zeroes_previously(IntegerVector input) {
// ** input is a vector of 0 and 1, indicating if timeperiod_num==lag_timeperiod_num+1 **
NumericVector res = NumericVector(input.length());
for (int i=0; i<input.length(); i++) {
int prev_res;
if (i==0) {
// first row of new group
res[i] = 1;
prev_res = 1;
} else {
// 2nd row of group onwards
res[i] = std::min(input[i], prev_res);
prev_res = res[i];
// ** when next line is commented out, produces incorrect result **
std::cout << "";
}
}
return res;
}')
test = c(1,1,0,1,0,0)
# expected result: 1 1 0 0 0 0
# result with print: 1 1 0 0 0 0
# result without print: 1 1 0 1 0 0
any_zeroes_previously(test)
您正在使用未初始化的变量 prev_res
,这是未定义的行为,可以是任何东西。
for 循环的每次迭代 re-declares prev_res
如果 i != 0
然后取 input[i]
和 prev_res
中的最小值(任何值)。一个简单的解决方法是将 prev_res
置于 for 循环之外:
cppFunction(
'NumericVector any_zeroes_previously(IntegerVector input) {
// ** input is a vector of 0 and 1, indicating if timeperiod_num==lag_timeperiod_num+1 **
NumericVector res = NumericVector(input.length());
int prev_res;
for (int i=0; i<input.length(); i++) {
if (i==0) {
// first row of new group
res[i] = 1;
prev_res = 1;
} else {
// 2nd row of group onwards
res[i] = std::min(input[i], prev_res);
prev_res = res[i];
// ** when next line is commented out, produces incorrect result **
std::cout << "";
}
}
return res;
}')
我正在尝试编写一个函数,它接受一个由 0 和 1 组成的向量(输入),returns 是一个等于第一个向量的向量,但如果前面有任何元素,每个元素都会被 0 覆盖为 0(水库)。第一个元素默认为 1。为此,对于每个 i,我 return 输入向量的第 i 个元素的最小值和先前的结果 (prev_res).
当我 运行 我的函数得到了错误的输出(正是输入),但是当我调用 std::cout
来打印一个空行时,我得到了预期的结果。这看起来很奇怪!
我附上了下面的代码。
library(Rcpp)
cppFunction(
'NumericVector any_zeroes_previously(IntegerVector input) {
// ** input is a vector of 0 and 1, indicating if timeperiod_num==lag_timeperiod_num+1 **
NumericVector res = NumericVector(input.length());
for (int i=0; i<input.length(); i++) {
int prev_res;
if (i==0) {
// first row of new group
res[i] = 1;
prev_res = 1;
} else {
// 2nd row of group onwards
res[i] = std::min(input[i], prev_res);
prev_res = res[i];
// ** when next line is commented out, produces incorrect result **
std::cout << "";
}
}
return res;
}')
test = c(1,1,0,1,0,0)
# expected result: 1 1 0 0 0 0
# result with print: 1 1 0 0 0 0
# result without print: 1 1 0 1 0 0
any_zeroes_previously(test)
您正在使用未初始化的变量 prev_res
,这是未定义的行为,可以是任何东西。
for 循环的每次迭代 re-declares prev_res
如果 i != 0
然后取 input[i]
和 prev_res
中的最小值(任何值)。一个简单的解决方法是将 prev_res
置于 for 循环之外:
cppFunction(
'NumericVector any_zeroes_previously(IntegerVector input) {
// ** input is a vector of 0 and 1, indicating if timeperiod_num==lag_timeperiod_num+1 **
NumericVector res = NumericVector(input.length());
int prev_res;
for (int i=0; i<input.length(); i++) {
if (i==0) {
// first row of new group
res[i] = 1;
prev_res = 1;
} else {
// 2nd row of group onwards
res[i] = std::min(input[i], prev_res);
prev_res = res[i];
// ** when next line is commented out, produces incorrect result **
std::cout << "";
}
}
return res;
}')