所以早些时候我回答了自己关于在R中向量中思考的问题.但是现在我还有另一个问题,我无法"矢量化".我知道向量更快,循环更慢,但我无法弄清楚如何在向量方法中执行此操作:
我有一个数据框(出于感情上的原因,我喜欢称之为my.data),我想对其进行全面的边缘分析.我需要一次删除一些元素并"数值"数据框然后我需要通过仅删除下一个元素再次进行迭代.然后再做一次......再次......我的想法是对我的数据子集进行全面的边际分析.无论如何,我无法想象如何以矢量有效的方式做到这一点.
我缩短了代码的循环部分,它看起来像这样:
for (j in my.data$item[my.data$fixed==0]) { # <-- selects the items I want to loop
# through
my.data.it <- my.data[my.data$item!= j,] # <-- this kicks item j out of the list
sum.data <-aggregate(my.data.it, by=list(year), FUN=sum, na.rm=TRUE) #<-- do an
# aggregation
do(a.little.dance) && make(a.little.love) -> get.down(tonight) # <-- a little
# song and dance
delta <- (get.love) # <-- get some love
delta.list<-append(delta.list, delta, after=length(delta.list)) #<-- put my love
# in a vector
}
Run Code Online (Sandbox Code Playgroud)
显然我在中间砍掉了一堆东西,只是为了让它不那么笨拙.目标是使用更高矢量效率的东西来移除j循环.有任何想法吗?
这个问题来自一系列其他问题,这些问题都涉及到同样的问题.出于某些奇怪的原因,在第二个函数中找不到第一个函数的局部环境中定义的变量的意义上,在另一个函数中使用函数有时会失败.
伪代码中的经典模式:
ff <- function(x){
y <- some_value
some_function(y)
}
ff(x)
Run Code Online (Sandbox Code Playgroud)
eval(expr,envir,enclos)中的错误:找不到对象'y'
首先我认为它与S4方法和那里的范围有关,但它也与其他函数一起发生.我和R开发团队进行了一些互动,但是他们所做的只是让我直接进入错误报告站点(我不得不说,这不是最吸引人的站点).我从来没有得到任何反馈.
随着问题不断出现,我想知道是否有一个逻辑解释.在所有这些情况下是否是一个常见的错误,如果是这样,哪一个?或者它真的是一个错误?
其中一些问题:
PS:我知道R-devel列表,万一你想知道......
我知道有一些优化的算法可用于所有类型的矩阵分解(QR分解,SVD,......),乘法等.然而,我找不到一个好的概述.对于C++,这个问题中有一些有用的信息,但我在C中寻找那些东西.
在绘制histogarm,散点图和其他图表时,如果轴在R中按比例缩放到对数刻度,如何使用10 ^ -1 10 ^ 0 10 ^ 1 10 ^ 2 10 ^ 3等标签代替显示的轴只有-1,0,1,2,3等什么参数应该添加到命令,如hist(),plot()等?
这个问题的灵感来自于Duncan Murdoch在r-devel邮件列表中回应关于Sweave的错误报告的评论:
这是在R-patched中修复的.(如果更多的人测试了测试版,它将在2.12.0中得到修复......).
老实说,出于多种原因,我已远离beta -aka开发版本,这些是我听到更多人的原因:
但正如我所理解的那样,这将是对R社区的宝贵贡献,而且如果我能以某种方式将其融入我自己的工作中,我也愿意进行一些测试.我正在考虑将测试版保留在一边并通过它运行我的脚本以及检查.保存构造的对象可以快速,轻松all.equal()地查看是否有错误.
关于如何以最少的努力和最大的效率帮助测试的任何人有更多/更好的想法?
我也想在我们的部门推广这一点.除了"现在是回馈社区的时候"之外,为什么测试贝塔值得努力的其他任何好理由呢?我怎样才能反驳上面给出的论点?
编辑:
正如Dirk Eddelbuettel在评论中指出的那样,部分交易正在阻止Windows中的路径变量.我对此有一些想法,但是关于如何实际组织计算机以测试R-devel版本的提示也非常受欢迎.
因为最近SO有点慢,我发布了一个简单的问题.如果大鱼留在替补席上为新手提供回应,我将不胜感激.
有时我们的对象具有大量的大型列表元素(向量).您如何将此对象"取消"到单个向量中.证明你的方法比你快unlist().
基本R图函数通常使用参数lwd来指定线条粗细.这些是相对线宽,不同的帮助文件表明这是一个倍增因素.所以线宽lwd = 1给出的线宽为1 * defaultwidth.
我在哪里指定该行的默认宽度,或者如何确定一行例如具体为0.75pt,如Excel等其他软件中所设置的那样?
我试图在不同的文件中为闪亮的应用程序分割代码,但无法在Shiny中使其正常工作.我的尝试可以在这个演示中找到
如何将我的代码拆分到不同的文件上,但仍保留"运行应用程序按钮"并在RStudio中重新启用"代码完成"?
如果不 !我可以与Visual Studio集成闪亮吗?
这个问题恰逢其时,因为我也在努力优化.我知道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)