小编Pat*_*thy的帖子

无法在foreach中运行Rcpp函数 - "NULL值作为符号地址传递"

首先我要说的是我读过写R扩展,Rcpp包的插图,以及我已经构建了一个包Rcpp.package.skeleton().

自从构建我的包之后,我添加了一个函数,multiGenerateCSVrow()然后compileAttributes()在R CMD build/R CMD安装之前在包目录上运行.之后予加载我包,我可以直接地或通过运行我功能foreach()%do%方法.

当我尝试并行运行时,我收到一个错误:

cl <- makePSOCKcluster(8)                                                                                     
registerDoParallel(cl)                                                                                        
rows <- foreach(i=1:8,.combine=rbind,.packages="myPackage") %dopar% multiGenerateCSVrow(scoreMatrix=NIsample,   
                                                                   validMatrix = matrix(1,nrow=10,ncol=10),   
                                                                   cutoffVector = rep(0,10),                  
                                                                   factorVector = randomsCutPlus1[i,],        
                                                                   actualVector = rep(1,10),                  
                                                                   scaleSample = 1)                           
stopCluster(cl)                                                                                               
~                                                                                                             

Error in multiGenerateCSVrow(scoreMatrix = NIsample, validMatrix = matrix(1,  : 
  task 1 failed - "NULL value passed as symbol address"
Run Code Online (Sandbox Code Playgroud)

这是NAMESPACE包:

# Generated by roxygen2 (4.0.1): do not edit by hand 
useDynLib(myPackage)                                   
exportPattern("^[[:alpha:]]+")                       
importFrom(Rcpp, evalCpp) 
Run Code Online (Sandbox Code Playgroud)

这是RcppExports.cpp的相关块:

// multiGenerateCSVrow
SEXP …
Run Code Online (Sandbox Code Playgroud)

r rcpp

23
推荐指数
3
解决办法
5910
查看次数

如何在闪亮的情况下触发数据刷新?

我有一个闪亮的应用程序,它将SQL中的数据查询到数据框中,然后从我的shinyServer()块中引用这些数据框.到目前为止,我一直只在RStudio中运行它,因此每当我需要新数据时,我只是重新启动应用程序,在服务器加载之前,它将获取所有新数据.

我想将应用程序转换为闪亮的服务器,但我不确定如何诱导它定期获取新数据.为了界面,我希望它是自动的,而不是让用户点击按钮来启动加载.这有一个惯用的解决方案吗?

编辑:

我想我找到了一个适合我的解决方案.

shinyServer(function(input,output,session){
    sourceData <- reactive({
        invalidateLater(1000000,session)

        functionThatGetsData()
    })
})
Run Code Online (Sandbox Code Playgroud)

r shiny

17
推荐指数
2
解决办法
2万
查看次数

如何在乳胶编织图标题中加入希腊字母?

我搜索了这个,但是找不到它.在knitr文档中,我想将$\alpha_1 $作为标题添加到如下情节:

<<fig.cap='$\alpha_1$'>>=
 plot(1:5,1:5)
@
Run Code Online (Sandbox Code Playgroud)

试图编织这个错误

! Text line contains an invalid character.
l.172 ...axwidth]{figure/plotSigma1} \caption[$^^G
                                              lpha_1$]{$^^Glpha_1$\label...
Run Code Online (Sandbox Code Playgroud)

有办法吗?

latex r knitr

13
推荐指数
1
解决办法
3905
查看次数

Rcpp - 在sourceCpp引用的文件中使用多个C++函数?

我希望这不是太明显,因为我整天搜索并找不到答案.

说我有以下R文件:

library(Rcpp)
sourceCpp("cfile.cpp")

giveOutput(c(1,2,3))
Run Code Online (Sandbox Code Playgroud)

它编译以下C++文件:

#include <Rcpp>
using namespace Rcpp;
// [[Rcpp::export]]

NumericVector plusTwo(NumericVector x){
  NumericVector out = x + 2.0;

  return out;
}

NumericVector giveOutput(NumericVector a){

NumericVector b = plusTwo(a);
return b;
}
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,Rcpp预处理器都plusTwo()可用,而giveOutput()不是.我能够找到的文档说这是一个应该创建一个包的点,但是在阅读了包后,它看起来比我需要的要复杂一个数量级.

如果没有明确定义plusTwo()内部giveOutput(),我该怎么办?

r rcpp

11
推荐指数
1
解决办法
2981
查看次数

为什么plyr包不使用我的并行后端?

我正在尝试使用parallelR中的包进行并行操作,而不是doSNOW因为它是内置的,表面上是R Project想要的东西.我做错了,但我不能确定.以此为例:

a <- rnorm(50)
b <- rnorm(50)

arr <- matrix(cbind(a,b),nrow=50)

aaply(arr,.margin=1,function(x){x[1]+x[2]},.parallel=F)
Run Code Online (Sandbox Code Playgroud)

这很好用,产生了我的两列的总和.但是,如果我尝试引入并行包:

library(parallel)
nodes <- detectCores()
cl <- makeCluster(nodes)
setDefaultCluster(cl)

aaply(arr,.margin=1,function(x){x[1]+x[2]},.parallel=T)
Run Code Online (Sandbox Code Playgroud)

它抛出错误

2: In setup_parallel() : No parallel backend registered
3: executing %dopar% sequentially: no parallel backend registered 
Run Code Online (Sandbox Code Playgroud)

我初始化后端错了吗?

parallel-processing r plyr

8
推荐指数
1
解决办法
5886
查看次数

将文本向量转换为R中的数字矩阵/ data.frame的更快方法?

我正在使用R来解析一些生成如下列表的服务器日志:

myLog <- c("[1,2,3]","[4,5,6]","[7,8,9]")
Run Code Online (Sandbox Code Playgroud)

我想从它们生成的是一个如下所示的矩阵:

myMatrix <- matrix(c(c(1,2,3),c(4,5,6),c(7,8,9)),nrow=3,byrow=T)
Run Code Online (Sandbox Code Playgroud)

它们来自查询varchar类型的数据库字段,所以我认为我不能使用任何文件读取技巧.

我倾向于拥有大量这些,一次数百万行.

我一直在做的是以下,它很慢:

splitDat <- sapply(inputVector,function(y){
  y1 <- gsub("\\[","",y)
  y2 <- gsub("\\]","",y1)
  y3 <- strsplit(y2,split=", ")
  y4 <- unlist(y3)
})
Run Code Online (Sandbox Code Playgroud)

有更有效的方法吗?单行正则表达式?

r

8
推荐指数
2
解决办法
459
查看次数

如何杀死doMC工作人员?

doMC的文档似乎非常稀疏,仅列出了doMC-package和registerDoMC().我遇到的问题是我会通过doMC/foreach产生几个工作者,但是当工作完成后,他们只是坐在那里占用内存.我可以去寻找他们的进程ID,但我经常意外地杀死主进程.

library(doMC)
library(foreach)

registerDoMC(32)

foreach(i=1:32) %dopar% foo()

##kill command here?
Run Code Online (Sandbox Code Playgroud)

我试过跟随registerDoSEQ(),但它似乎没有杀掉进程.

parallel-processing foreach r domc

6
推荐指数
2
解决办法
2539
查看次数

如何在R中获得一个大的稀疏矩阵?(&gt; 2^31-1)

我使用一些 C++ 代码从数据库中获取一个文本文件,并从Matrix包中创建一个 dgcMatrix 类型的稀疏矩阵。我第一次尝试构建一个具有超过 2^31-1 个非稀疏成员的矩阵,这意味着稀疏矩阵对象中的索引向量也必须长于该限制。不幸的是,向量似乎使用 32 位整数索引,就像 Rcpp 中的 NumericVectors 一样。

除了从头开始编写全新的数据类型之外,R 是否为此提供了任何便利?我不认为我可以使用太奇特的解决方案,因为我需要glmnet识别结果对象。

r sparse-matrix 32bit-64bit rcpp

6
推荐指数
2
解决办法
885
查看次数

R中的矩形括号的正则表达式

通常在R中,可以在具有两个斜杠的正则表达式中使用元字符,例如(变为\(,但我发现方括号不同).

mystring <- "abc[de"

#remove [,] and $ characters

gsub("[\\[\\]$]","",mystring)

[1] "abc[de"
Run Code Online (Sandbox Code Playgroud)

[[:punct:]]但是如果我不需要,我讨厌使用非标准的正则表达式.可以使用正则表达式集语法吗?

regex r

6
推荐指数
1
解决办法
273
查看次数

如何从长表中有效地创建SparseDataFrame?

我有一个SQL表,我可以作为Pandas数据框读入,具有以下结构:

user_id    value
1          100
1          200
2          100
4          200
Run Code Online (Sandbox Code Playgroud)

它是矩阵的表示,所有值都是1或0.此矩阵的密集表示如下所示:

    100  200
1   1    1
2   1    0
4   0    1
Run Code Online (Sandbox Code Playgroud)

通常,要进行此转换,您可以使用pivot,但在我的情况下,在第一个表中有数十或数亿行,因此会得到一个充满零的大密集矩阵,拖动成本很高.您可以将其转换为稀疏,但是到目前为止需要大量资源.

现在我正在研究一种解决方案,为每个user_id分配行号,排序,然后在重新组合成SparseDataFrame之前将'value'列拆分为SparseSeries.有没有更好的办法?

python sparse-matrix pandas

6
推荐指数
1
解决办法
441
查看次数