首先我要说的是我读过写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) 我有一个闪亮的应用程序,它将SQL中的数据查询到数据框中,然后从我的shinyServer()块中引用这些数据框.到目前为止,我一直只在RStudio中运行它,因此每当我需要新数据时,我只是重新启动应用程序,在服务器加载之前,它将获取所有新数据.
我想将应用程序转换为闪亮的服务器,但我不确定如何诱导它定期获取新数据.为了界面,我希望它是自动的,而不是让用户点击按钮来启动加载.这有一个惯用的解决方案吗?
编辑:
我想我找到了一个适合我的解决方案.
shinyServer(function(input,output,session){
sourceData <- reactive({
invalidateLater(1000000,session)
functionThatGetsData()
})
})
Run Code Online (Sandbox Code Playgroud) 我搜索了这个,但是找不到它.在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)
有办法吗?
我希望这不是太明显,因为我整天搜索并找不到答案.
说我有以下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(),我该怎么办?
我正在尝试使用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)
我初始化后端错了吗?
我正在使用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)
有更有效的方法吗?单行正则表达式?
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(),但它似乎没有杀掉进程.
我使用一些 C++ 代码从数据库中获取一个文本文件,并从Matrix包中创建一个 dgcMatrix 类型的稀疏矩阵。我第一次尝试构建一个具有超过 2^31-1 个非稀疏成员的矩阵,这意味着稀疏矩阵对象中的索引向量也必须长于该限制。不幸的是,向量似乎使用 32 位整数索引,就像 Rcpp 中的 NumericVectors 一样。
除了从头开始编写全新的数据类型之外,R 是否为此提供了任何便利?我不认为我可以使用太奇特的解决方案,因为我需要glmnet识别结果对象。
通常在R中,可以在具有两个斜杠的正则表达式中使用元字符,例如(变为\(,但我发现方括号不同).
mystring <- "abc[de"
#remove [,] and $ characters
gsub("[\\[\\]$]","",mystring)
[1] "abc[de"
Run Code Online (Sandbox Code Playgroud)
[[:punct:]]但是如果我不需要,我讨厌使用非标准的正则表达式.可以使用正则表达式集语法吗?
我有一个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.有没有更好的办法?