我第一次尝试了Rcpp功能inline,它解决了我的速度问题(感谢Dirk!):
R:将负值替换为零
初始版本看起来像这样:
library(inline)
cpp_if_src <- '
Rcpp::NumericVector xa(a);
int n_xa = xa.size();
for(int i=0; i < n_xa; i++) {
if(xa[i]<0) xa[i] = 0;
}
return xa;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
Run Code Online (Sandbox Code Playgroud)
但是当被调用时cpp_if(p),它会p用输出覆盖,这不是预期的.所以我认为它是通过引用传递的.
所以我用以下版本修复它:
library(inline)
cpp_if_src <- '
Rcpp::NumericVector xa(a);
int n_xa = xa.size();
Rcpp::NumericVector xr(a);
for(int i=0; i < n_xa; i++) {
if(xr[i]<0) xr[i] = 0;
}
return xr;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
Run Code Online (Sandbox Code Playgroud)
这似乎有效.但是现在,当我将其重新加载到R中时,原始版本不再覆盖其输入(即,相同的确切代码现在不会覆盖其输入):
> cpp_if_src <- '
+ Rcpp::NumericVector …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码
library(data.table) # 1.9.2
x <- data.frame(letters[1:2])
setDT(x)
class(x)
## [1] "data.table" "data.frame"
Run Code Online (Sandbox Code Playgroud)
这是预期的结果.现在,如果我跑
x <- letters[1:2]
setDT(data.frame(x))
class(x)
## [1] "character"
Run Code Online (Sandbox Code Playgroud)
由于某种原因class,它x保持不变.
一种可能性是setDT只更改全局环境中的对象类,所以我尝试过
x <- data.frame(letters[1:2])
ftest <- function(x) setDT(x)
ftest(x)
class(x)
##[1] "data.table" "data.frame"
Run Code Online (Sandbox Code Playgroud)
似乎setDT不太关心对象的环境以便改变它的类.
是什么导致了上述行为?它只是一个错误或背后有一些常识吗?
我有一个字符向量x,我想以快速的方式变成一行data.table.该命令data.table(x)返回一列data.table.现在,data.table(t(x))完成工作,但我想知道是否有更快的方法.
我有一些R,例如:
x<-c(-3,1,-5,7,-10)
y<-c(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
我想在某些条件下检查x的元素,即<0,如果为true,则根据它操纵y.
例如,如果我的逻辑检查是x <0,那么y的元素[0],[2],[4]将被修改,即:
print(y)
y=[0,2,0,3,0]
Run Code Online (Sandbox Code Playgroud)
我已经google了一下,无法找到任何符合元素的东西.我确信这是谷歌的失败,但非常感谢.