小编nru*_*ell的帖子

RcppArmadillo:内存使用问题

我已经开始使用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?

非常感谢您的帮助.非常感谢.

c++ memory r rcpp

5
推荐指数
1
解决办法
816
查看次数

如何添加导致错误的行的信息?

我想使用一个将错误导出到.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

5
推荐指数
0
解决办法
126
查看次数

为什么这个Rcpp代码慢于字节编译R?

正如问题标题所示,我想知道为什么编译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(funcCppfuncCpp2)比编译的R(func1cfunc2c)字节快得多,特别是因为R会有更多的开销用于存储(1+alpha)**tau或需要重新计算它.事实上,计算这个指数两次似乎比R(func1cvs func2c)中的内存分配更快,这似乎特别违反直觉,因为n它很大.我的另一个猜测是,也许compiler::cmpfun是在扯掉一些魔法,但我想知道是否确实如此.

真的,我想知道的两件事是:

  1. 为什么funcCpp和funcCpp2比func1c和func2c慢?(Rcpp比编译的R函数慢)

  2. 为什么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)

c++ performance numerical r rcpp

5
推荐指数
1
解决办法
706
查看次数

找到长度为n的所有可能的子串

我有一个有趣的(仅限我,也许,:))问题.我有这样的文字:

"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不起作用.

r

5
推荐指数
2
解决办法
1089
查看次数

犰狳从向量重塑为立方体

我想拿一个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)

但肯定有更优雅的方式吗?

r armadillo rcpp

5
推荐指数
1
解决办法
730
查看次数

使用UTF-8编码错误将.csv导入R?

我有一个用西班牙语写的.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编码并且文件以相同的方式编码.

有什么建议吗?

csv encoding r utf-8

5
推荐指数
1
解决办法
8067
查看次数

如何在编写R扩展时返回命名的VECSXP

最近我遇到了一个错误,当我修复它时,我想知道是否有可能返回一个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)

或者这不可能吗?

c r s-expression r-extension

5
推荐指数
2
解决办法
501
查看次数

在 R 脚本中定义编码?

是否可以在 R 脚本中定义编码?

类似的东西(只是例子):

encoding("utf-8")
Run Code Online (Sandbox Code Playgroud)

我知道在 RStudio 中使用编码重新打开,但我不是在寻找这个。

r character-encoding

5
推荐指数
1
解决办法
1674
查看次数

有没有一种方法可以显示在Shiny中构建的图,而不是等待所有图?

我有一个包含许多情节的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()这样的调用?

在我的页面上,我正在加载动画,以便用户知道正在发生的活动,这使它们在一次加载时更加明显。

我当然可以有一个更简单的页面,但是那样就不会成为仪表盘了。:)

r shiny plotly

5
推荐指数
1
解决办法
230
查看次数

如何打印可被7整除的数字

是否有任何功能可以让我检查x是否可被任何数字整除?我需要编写一个重复循环,其整数范围为1:100,并且还使用if函数将所有可从该范围整除的数字写入.这是我到目前为止所得到的:

x <- 1
repeat {
    print(x)
    x = x+1
    if (x > 100) {
        break
    }
}
Run Code Online (Sandbox Code Playgroud)

它只打印我需要的第一部分.

r

5
推荐指数
1
解决办法
1949
查看次数