这个问题恰逢其时,因为我也在努力优化.我知道R中不同的"正常"优化程序,我知道像雪,降雪,Rmpi等喜欢的并行包.然而,我没有设法在我的计算机上并行运行优化.
一些玩具代码说明:
f <- function(x) sum((x-1:length(x))^2)
a <- 1:5
optim(a,f)
nlm(f,a)
Run Code Online (Sandbox Code Playgroud)
我想要做的是并行化optim()函数(或nlm()函数,它基本相同).我的真实函数f()要复杂得多,一个优化循环持续大约半小时.如果我想运行100个样本的模拟,那个需要很长时间.我想避免为并行计算编写自己的牛顿算法,所以我希望有人能给我一些关于如何在R中使用并行计算来解决复杂优化问题的提示.
我认为这个问题与相关问题的问题不同.我的请求专门针对并行计算,而非一些更快的替代优化.
我正在尝试比较并行化选项.具体来说,我正在将标准SNOW和mulitcore实现与使用doSNOWor doMC和foreach.作为一个样本问题,我通过多次计算从标准正态分布中抽取的样本的均值来说明中心极限定理.这是标准代码:
CltSim <- function(nSims=1000, size=100, mu=0, sigma=1){
sapply(1:nSims, function(x){
mean(rnorm(n=size, mean=mu, sd=sigma))
})
}
Run Code Online (Sandbox Code Playgroud)
这是SNOW实施:
library(snow)
cl <- makeCluster(2)
ParCltSim <- function(cluster, nSims=1000, size=100, mu=0, sigma=1){
parSapply(cluster, 1:nSims, function(x){
mean(rnorm(n=size, mean=mu, sd=sigma))
})
}
Run Code Online (Sandbox Code Playgroud)
接下来,doSNOW方法:
library(foreach)
library(doSNOW)
registerDoSNOW(cl)
FECltSim <- function(nSims=1000, size=100, mu=0, sigma=1) {
x <- numeric(nSims)
foreach(i=1:nSims, .combine=cbind) %dopar% {
x[i] <- mean(rnorm(n=size, mean=mu, sd=sigma))
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
> system.time(CltSim(nSims=10000, size=100))
user system elapsed …Run Code Online (Sandbox Code Playgroud) 在我们的服务器上,按照http://cran.r-project.org/bin/linux/debian/上的说明安装R 2.12.1 ,使用apt-get install等等.
由于情况,旧的lenny机器还没有更新到新的稳定debian,看起来这不会很快发生.由于这里的一些研究取决于最新版本的VGAM,我们需要在debian上安装R 2.14.0.但是为了保持旧代码的运行,我们不能只丢弃R 2.12.1(在此版本上安装VGAM 0.8.4会产生错误).
所以我们需要安装2个R版本.从我理解的小,如果我们只是使用apt-get upgrade旧版本将被新的替换.我一直在阅读大量文档,但我找不到这样做的最佳方式.
我现在唯一想象的就是尝试从源代码构建最新的R,但我的同事并不是非常热衷于这个想法,并促使我首先寻找另一个解决方案.我错过了任何信息,或者是否有人愿意向我展示完成这项工作的小技巧?如果从源头构建解决方案,我想知道任何陷阱或可能的问题.
我已多次遇到以下问题.
假设您有两个类,classA并classB在以下文件中进行了描述classA.R:
#' the class classA
#'
#' This is a class A blabla
#' \section{Slots}{\describe{\item{\code{A}}{a Character}}}
#' @ name classA
#' @rdname classA
#' @exportClass classA
setClass("classA",representation(A="character"))
Run Code Online (Sandbox Code Playgroud)
和 classB.R
#' the class classB
#'
#' This is a class B blabla
#' \section{Slots}{\describe{\item{\code{B}}{an object of class A}}}
#' @ name classB
#' @rdname classB
#' @exportClass classB
setClass("classB",representation(B="classA"))
Run Code Online (Sandbox Code Playgroud)
我相信这些文件是按字母顺序读取的roxygen2,但事实并非如此.如果我尝试构建包,我可能会收到以下错误:
roxygenize("./myExample")
Error in getClass(Class, where = topenv(parent.frame())) :
"ClassA" is not a …Run Code Online (Sandbox Code Playgroud) 每次我重新启动RStudio时,它都要求我重新加载之前在工作区中加载的所有软件包.我似乎无法弄清问题是什么,RStudio在关闭项目时正在保存项目.
当我打开项目时,如何确保RStudio重新加载必要的包?
我正在使用R语言,R网站上的手册非常有用.但是,我想看一些R的例子和实现,它可以帮助我更快地发展我的知识.有什么建议?
我试图在R中进行多次插补并安装了Amelia并试图打开AmeliaView,但它说需要tcltk包.我继续安装tcltk但错误消息弹出如下.有人能帮助我吗?
> AmeliaView()
Loading required package: tcltk
Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
call: dyn.load(file, DLLpath = DLLpath, ...)
error: unable to load shared object '/Library/Frameworks/R.framework/Versions/2.12/Resources/library/tcltk/libs/i386/tcltk.so':
dlopen(/Library/Frameworks/R.framework/Versions/2.12/Resources/library/tcltk/libs/i386/tcltk.so, 10): Library not loaded: /usr/local/lib/libtcl8.5.dylib
Referenced from: /Library/Frameworks/R.framework/Versions/2.12/Resources/library/tcltk/libs/i386/tcltk.so
Reason: image not found
Error in AmeliaView() : The package 'tcltk' is required
> require(tcltk2)
Loading required package: tcltk2
Loading required package: tcltk
Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
call: dyn.load(file, …Run Code Online (Sandbox Code Playgroud) 我有一个列为6列37行的列联表数据矩阵.我需要应用Chi平方变换来给出行轮廓和柱轮廓以进行对应分析.
不幸的是,我被告知我将需要使用嵌套循环来转换数据并执行CA(而不是在R中使用更合理的方式).我得到了用于嵌套循环的结构:
transformed.data=data0
for (row.index in 1:nrow(data)) {
for (col.index in 1:ncol(data)) {
transfomed.data[row.index,col.index]=
"TRANSFORMATION"[row.index,col.index]
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,通过使用嵌套循环,它将首先将"TRANSFORMATION"应用于行,然后应用于列.
我想要对数据进行的转换以获取行配置文件:
( X(ij)/ sum(X(i)))/sqrt(sum(X(j)))
虽然我想要对数据进行的转换以获得列配置文件:
( X(ij)/ sum(X(j)))/sqrt(sum(X(i)))
我将在嵌套循环的最后一行输入什么作为我的"TRANSFORMATION",以便输出我想要的配置文件转换.否则,如果我错过了解嵌套循环的要点,请描述它允许我做什么.
这是我的数据子集的代码:
matrix(c(15366,2079,411,366,23223,2667,699,819,31632,2724,717,1473,49938,3111,1062,11964)
,nrow=4,ncol=4,byrow=T)
Run Code Online (Sandbox Code Playgroud)
所以单独使用这个子集我会期望第一行的行配置文件是:
0.002432689 0.0003291397 6.506803e-05 5.794379e-05
Run Code Online (Sandbox Code Playgroud)
并且第一列的列配置文件为:
0.0009473414, 0.0132572344, 0.0572742202, 0.0132863528
Run Code Online (Sandbox Code Playgroud) 我正在使用一个带有几十个字段的引用类.我已经设置了一个initialize()采用列表对象的方法.虽然有些字段依赖于列表元素的进一步计算,但大多数字段都是从列表元素直接分配的:
fieldA <<- list$A
fieldB <<- list$B
Run Code Online (Sandbox Code Playgroud)
我当时觉得自动化这个很好.举一个R伪代码的例子(这个例子显然不起作用):
for (field in c('A', 'B', 'C', 'D'))
field <<- list[[field]]
Run Code Online (Sandbox Code Playgroud)
我已经尝试过几次结束运行<<-,例如:
for field in c('A', 'B', 'C', 'D'))
do.call('<<-' c(field, list[[field]]))
Run Code Online (Sandbox Code Playgroud)
但没有骰子.
我的猜测是,在目前的参考类化身中,这种行为根本不可能,但是认为在SO土地上有人知道有更好的方法可以做到这一点可能是值得的.
我getYahooData()在TTR包中使用功能非常强烈.
我有这段代码:
for(i in 1:nrow(symbol)){
tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"),
warning=function(e) continue <- 0)
if (continue==0) next
}
Run Code Online (Sandbox Code Playgroud)
这个循环很长我得到这个错误:
文件错误(文件,"rt"):所有连接都在使用中调用:tryCatch ... doTryCatch - > getYahooData - > getYahooData - > read.table - > file执行暂停
我能做什么?
更新:
如果我使用closeAllConnections(),我得到:
I get: *** caught segfault *** address (nil), cause 'memory not mapped' Traceback: 1: getConnection(set[i]) 2: close(getConnection(set[i])) 3: closeAllConnections() aborting ...
Run Code Online (Sandbox Code Playgroud) r ×10
debian ×1
foreach ×1
installation ×1
lenny ×1
nested-loops ×1
optimization ×1
package ×1
r-faq ×1
roxygen2 ×1
rstudio ×1
s4 ×1
transform ×1
try-catch ×1