在Rcpp中从列表中删除元素

3
假设我有以下列表:
x <- list(a = c(1, 2), b = c("a", "c"), c = 1:10)

在R中,我可以使用以下两种方法删除第一个元素:
x[-1]
x[1] <- NULL

我正在尝试用Rcpp实现同样的功能,但我无法弄清楚。以下代码只是将NULL赋值给第一个元素。
// [[Rcpp::export]]
Rcpp::List removeElement(Rcpp::List x)
{
  x[0] = R_NilValue;
  return(x);
}

任何想法?
1个回答

3
关于这个问题
// [[Rcpp::export]]
Rcpp::List removeElement(Rcpp::List x, int j)
{
  IntegerVector idx = seq_len(x.length());
  return(x[idx != j]);
}

如果要从0开始使用索引,请使用以下方法:

IntegerVector idx = seq_len(x.length()) - 1;

谢谢您的回复。我不知道我们可以使用 x[idx != j]。对于我的问题,我正在寻找一个更通用的解决方案。我想在函数内部使用 if-else 语句来决定 j,并且可能需要删除许多元素。例如,我可能希望删除所有长度为2的列表元素。 - HBat
3
使用x[!sapply(x, !isLengthTwo)],其中isLengthTwo是一个接受SEXP并返回bool的函数。通常情况下,您可以使用x[sapply(x, f)],其中f是您选择的某个函数/函数对象。 - Kevin Ushey
1
你现在只选择长度为2的元素,Kevin ;-) - Brouwer
我使用这个答案解决了我的问题。我使用循环逐一从末尾删除元素。@KevinUshey,感谢您的建议。我相信您的答案足够通用。 - HBat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接