我正在尝试学习如何在R中使用Rcpp。有人可以指出 找出此代码存在的问题。可能不止一个 问题。
当在代码底部的c
对象中输入fun()
时,我希望它输出带有值“ Home”,“ Elsewhere”或“ Number”的向量/数组。 / p>
我在这里发现数据类型有些混乱。我的原始数据集是一个因素。如果我将其放入storage.mode()
,它将返回integer
。我假设那时我必须将x
自变量分配为IntegerVector
。这使我感到困惑,因为数据包含字母,即“ H”和“ E”,那么数据如何是整数?
当我在if语句中说==“ H”时,我不知道它是否理解我的意思。
library(Rcpp)
c <- factor(c("E", "H", "E", "12", "10", "60", "80", "11", "H", "H"))
class(c)
storage.mode(c)
cppFunction(' IntegerVector fun(IntegerVector x){
// creates an empty character vector the size/length of x.
CharacterVector y = x.size() ;
int n = x.size() - 1 ;
//loop
for(int i = 0; i <= n; i = i + 1){
if(x[i] == "H"){
y[i] = "Home" ;
}else if(x[i] == "E"){
y[i] = "Elsewhere" ;
}else{
y[i] = "Number" ;
} ;
}
return y ;
}')
fun(c)
答案 0 :(得分:4)
注意:在整个过程中,我将参考f
,而不是c
。不好的做法是将变量命名为与内置函数或常量相同的变量,例如c
,T
或F
。因此,我将代码的开头更改如下:
library(Rcpp)
f <- factor(c("E", "H", "E", "12", "10", "60", "80", "11", "H", "H"))
除了查看class(f)
和storage.mode(f)
之外,查看str(f)
也很有用:
str(f)
# Factor w/ 7 levels "10","11","12",..: 6 7 6 3 1 4 5 2 7 7
实际上,因子是具有“级别”的整数向量:对应于每个唯一整数值的字符向量。幸运的是,您可以使用.attr()
的{{1}}成员函数从C ++中获得它:
Rcpp::IntegerVector
因此,要获得想要的东西,您必须做三件事:
cppFunction('CharacterVector fun(IntegerVector x){
// creates an empty character vector the size/length of x.
CharacterVector y = x.size() ;
// Get the levels of x
CharacterVector levs = x.attr("levels");
int n = x.size() - 1 ;
//loop
for(int i = 0; i <= n; i = i + 1){
if(levs[x[i]-1] == "H"){
y[i] = "Home" ;
}else if(levs[x[i]-1] == "E"){
y[i] = "Elsewhere" ;
}else{
y[i] = "Number" ;
} ;
}
return y ;
}')
fun(f)
# [1] "Elsewhere" "Home" "Elsewhere" "Number" "Number" "Number"
# [7] "Number" "Number" "Home" "Home"
更改为IntegerVector
(尽管您完全正确地认为输入应为CharacterVector
)IntegerVector
CharacterVector levs = x.attr("levels");
与levs[x[i]-1]
等,而不是"H"
- x[i]
始终是整数,给出与之对应的水平向量的元素。我们这样做x[i]
,因为C ++的索引为0,R的索引为1。其他说明:
正如您所说,很明显,“ [您正在尝试学习如何在R中使用Rcpp()”。您肯定会想花一些时间来学习诸如Rcpp for Everyone(这是有关因素的章节),Rcpp Gallery(这是有关因素的文章),Hadley's chapter on Rcpp和肯定是here可用的Rcpp小插曲。