我已经开始使用Rcpp了.我很喜欢.我对编程很新.我有一个关于内存使用的问题.以下是一个可重现的问题:
library(RcppArmadillo)
library(inline)
code <- "
Rcpp::NumericVector input_(input);
arma::cube disturb(input_.begin(), 2, 2, 50000000, false);
return wrap(2);
"
Test <- cxxfunction(signature(input = "numeric"), plugin = "RcppArmadillo", body = code)
input <- array(rnorm(2 * 2 * 50000000), dim = c(2, 2, 50000000))
Test(input)
Run Code Online (Sandbox Code Playgroud)
我的理解是,在上面的问题中,唯一的内存使用是当我将数组分配给R中的变量输入时.所以我应该只使用大约1.6 gb(2*2*50*8 = 1600).当我去Rcpp时,我使用SEXP对象初始化变量input_,这是一个指针.所以这不应该使用任何额外的内存.然后当我初始化变量扰乱时,我也使用指针并设置copy_aux = FALSE.所以我不应该使用任何记忆.因此,如果我的理解是正确的,那么在运行代码时我应该只使用1.6 GB.它是否正确?
但是,当我运行代码时,内存使用情况(通过查看Ubuntu中的系统监视器判断)跳到10 gb以上(从大约1 gb),然后再下降到4 gb左右.我不明白发生了什么.我是否错误地使用了Rcpp?
非常感谢您的帮助.非常感谢.
我想使用一个将错误导出到.txt文件的函数.到目前为止,我有:
error.function <- function() {
cat(geterrmessage(), file="c:/bla.txt", append=TRUE)
}
Run Code Online (Sandbox Code Playgroud)
然后,
options("error"=error.function)
Run Code Online (Sandbox Code Playgroud)
但是,这只能给我error没有相应的行号我可以请求帮助以扩展error.function以及有关行号的信息(我在Rstudio中的脚本以line1开头并上升到第2500行?
正如问题标题所示,我想知道为什么编译R代码(使用compiler::cmpfun)的字节比以下数学函数的等效Rcpp代码更快:
func1 <- function(alpha, tau, rho, phi) {
abs((alpha + 1)^(tau) * phi - rho * (1- (1 + alpha)^(tau))/(1 - (1 + alpha)))
}
Run Code Online (Sandbox Code Playgroud)
由于这是一个简单的数值运算,我原本期望Rcpp(funcCpp和funcCpp2)比编译的R(func1c和func2c)字节快得多,特别是因为R会有更多的开销用于存储(1+alpha)**tau或需要重新计算它.事实上,计算这个指数两次似乎比R(func1cvs func2c)中的内存分配更快,这似乎特别违反直觉,因为n它很大.我的另一个猜测是,也许compiler::cmpfun是在扯掉一些魔法,但我想知道是否确实如此.
真的,我想知道的两件事是:
为什么funcCpp和funcCpp2比func1c和func2c慢?(Rcpp比编译的R函数慢)
为什么funcCpp比func2慢?(Rcpp代码比纯R慢)
FWIW,这是我的C++和R版本数据
user% g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.0 (clang-700.0.72)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
user% R --version
R version 3.2.2 (2015-08-14) -- "Fire Safety"
Copyright (C) 2015 …Run Code Online (Sandbox Code Playgroud) 我有一个有趣的(仅限我,也许,:))问题.我有这样的文字:
"abbba"
Run Code Online (Sandbox Code Playgroud)
问题是在此字符串中查找长度为n的所有可能的子字符串.例如,如果n = 2,子串是
'ab','bb','ba'
Run Code Online (Sandbox Code Playgroud)
如果n = 3,子串是
'abb','bbb','bba'
Run Code Online (Sandbox Code Playgroud)
我想用这样的东西:
x <- 'abbba'
m <- matrix(strsplit(x, '')[[1]], nrow=2)
apply(m, 2, paste, collapse='')
Run Code Online (Sandbox Code Playgroud)
但我得到了一个警告,它对len = 3不起作用.
我想拿一个arma::vec物体并将其重塑为一个arma::cube物体。
例如:
vec param(mm*n*g);
param.randn();
cube LL = reshape(param,mm,n,g); // this line doesn't work
Run Code Online (Sandbox Code Playgroud)
我可以让它发挥作用的最简单方法是:
paramtemp = as<NumericVector>(wrap(param));
cube LL(paramtemp.begin(),mm,n,g);
Run Code Online (Sandbox Code Playgroud)
但肯定有更优雅的方式吗?
我有一个用西班牙语写的.csv文件,因此它有特殊字符,如ñ,á,é,í,ó,ú.因此,如果我在记事本中打开它,我可以看到正确写入的所有字符,并且我已经使用UTF-8编码保存了该文件.但是,当我打开RStudio并使用以下方法导入数据时:
servutf <- read.csv("servutf.csv", sep=";")
Run Code Online (Sandbox Code Playgroud)
我得到了所有数据集,但编码错误,即:
Tengo 7 años de experiencia
Run Code Online (Sandbox Code Playgroud)
它应该是以下内容:
Tengo 7 años de experiencia
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一切,我不知道还有什么要做,因为我已经检查过R使用UTF-8编码并且文件以相同的方式编码.
有什么建议吗?
最近我遇到了一个错误,当我修复它时,我想知道是否有可能返回一个VECSXP(即一个R列表类型),其中元素被命名.这个c ++代码:
SEXP do_bla()
{
int prtCnt = 0;
SEXP a = PROTECT(allocMatrix(REALSXP, 5, 5));
prtCnt++;
SEXP b = PROTECT(allocVector(REALSXP, 5));
prtCnt++;
SEXP OS = PROTECT(allocVector(VECSXP, 2));
prtCnt++;
SET_VECTOR_ELT(OS, 0, a);
SET_VECTOR_ELT(OS, 1, b);
UNPROTECT(prtCnt);
return OS;
}
Run Code Online (Sandbox Code Playgroud)
会给我一个R中两个元素(矩阵和向量)的列表:
s <- .Call("do_bla", ....)
Run Code Online (Sandbox Code Playgroud)
可以像这样索引:
s[[1]]; s[[2]]
Run Code Online (Sandbox Code Playgroud)
为了实现这一目标,我需要做些什么改变:
s$a; s$b
Run Code Online (Sandbox Code Playgroud)
或者这不可能吗?
是否可以在 R 脚本中定义编码?
类似的东西(只是例子):
encoding("utf-8")
Run Code Online (Sandbox Code Playgroud)
我知道在 RStudio 中使用编码重新打开,但我不是在寻找这个。
我有一个包含许多情节的Shiny Dashboard,所有情节都需要花费几秒钟来构建。一旦最后一个生成,它们都将显示。我希望每个图在完成后立即显示。我知道R是单线程的,但似乎必须要有一种“将执行返回到显示代码”的方法。
此代码演示了该问题:
library(shiny)
ui <- fluidPage(
title = "Page loading test"
, h1("Page loading test")
, plotOutput("plot1")
, plotOutput("plot2")
, plotOutput("plot3")
, plotOutput("plot4")
)
server <- function(input, output) {
output$plot1 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
output$plot2 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
output$plot3 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
output$plot4 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
}
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
睡眠只是为了模仿执行缓慢。
页面显示需要40秒钟。我希望页面花10s来显示plot1,然后再花10s来显示plot2,依此类推。在每个plot函数的底部是否有像UpdatePage()这样的调用?
在我的页面上,我正在加载动画,以便用户知道正在发生的活动,这使它们在一次加载时更加明显。
我当然可以有一个更简单的页面,但是那样就不会成为仪表盘了。:)
是否有任何功能可以让我检查x是否可被任何数字整除?我需要编写一个重复循环,其整数范围为1:100,并且还使用if函数将所有可从该范围整除的数字写入.这是我到目前为止所得到的:
x <- 1
repeat {
print(x)
x = x+1
if (x > 100) {
break
}
}
Run Code Online (Sandbox Code Playgroud)
它只打印我需要的第一部分.
r ×10
rcpp ×3
c++ ×2
armadillo ×1
c ×1
csv ×1
encoding ×1
memory ×1
numerical ×1
performance ×1
plotly ×1
r-extension ×1
s-expression ×1
shiny ×1
utf-8 ×1