我有两个ID列表.
我想比较两个列表,特别是我对以下数据感兴趣:
我也想画一个维恩图.
考虑在父环境中fn()存储最新输入x及其返回值的函数ret <- x^2。
makeFn <- function(){
xx <- ret <- NA
fn <- function(x){
if(!is.na(xx) && x==xx){
cat("x=", xx, ", ret=", ret, " (memory)", fill=TRUE, sep="")
return(ret)
}
xx <<- x; ret <<- sum(x^2)
cat("x=", xx, ", ret=", ret, " (calculate)", fill=TRUE, sep="")
ret
}
fn
}
fn <- makeFn()
Run Code Online (Sandbox Code Playgroud)
fn()仅在提供其他输入值时才进行计算。否则,它将ret从父环境中读取。
fn(2)
# x=2, ret=4 (calculate)
# [1] 4
fn(3)
# x=3, ret=9 (calculate)
# [1] 9
fn(3)
# x=3, ret=9 …Run Code Online (Sandbox Code Playgroud) optimization r mathematical-optimization nonlinear-optimization
什么是一种简单快捷的方法:
x <- list(a1=2, b1=c(1,2), c1=1:3)
y <- list(a2=5, b2=c(2,5), c2=2:4)
Run Code Online (Sandbox Code Playgroud)
至
list(list(x$a1, y$a2), list(x$b1, y$b2), list(x$c1, y$c2))
Run Code Online (Sandbox Code Playgroud)
?
或者一般来说:
如果列表x和y具有相同的长度并且它们的元素的长度也相应,那么如何将它组合成单个列表,如上所示?
我读到您必须stopCluster()在运行并行函数后使用:foreach()在 R 中。但是,我可以逃脱registerDoParallel(),然后运行foreach()任意多次,而无需使用stopCluster()。那我到底需要stopCluster()还是不需要?
不使用是否stopCluster()意味着您的核心正在忙于当前的任务?因此,如果我使用并行编程,中间只执行一点点单核顺序任务,那么我就不需要这样做stopCluster()?据我所知,设置并行也会产生大量的开销时间消耗。
我创建两个矩阵A和B相同的尺寸。A包含比更大的值B。矩阵乘法的A %*% A速度大约是的10倍B %*% B。
为什么是这样?
## disable openMP
library(RhpcBLASctl); blas_set_num_threads(1); omp_set_num_threads(1)
A <- exp(-as.matrix(dist(expand.grid(1:60, 1:60))))
summary(c(A))
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 0.000000 0.000000 0.000000 0.001738 0.000000 1.000000
B <- exp(-as.matrix(dist(expand.grid(1:60, 1:60)))*10)
summary(c(B))
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 0.0000000 0.0000000 0.0000000 0.0002778 0.0000000 1.0000000
identical(dim(A), dim(B))
## [1] TRUE
system.time(A %*% A)
# user system elapsed
# 2.387 …Run Code Online (Sandbox Code Playgroud) 如果在任何一个进程中parallel::mclapply()遇到错误(例如, a ) ,是否可以请求尽快放弃所有进一步的处理?stop()
我不知道如何在以下情况下进行,因为最后一个方程没有所有 4 个变量。所以使用了等式下面的代码,但这是错误的......有谁知道如何进行?
方程:
3a + 4b - 5c + d = 10
2a + 2b + 2c - d = 5
a -b + 5c - 5d = 7
5a + d = 4
Run Code Online (Sandbox Code Playgroud)
代码:
X <- matrix(c(3,4,-5,1,2,2,2,-1,1,-1,5,-5,5,0,0,1), 4, 4)
y <- matrix(c(10,5,7,4), 4, 1)
solve(X)%*%y #equivalent to solve(X, y)
Run Code Online (Sandbox Code Playgroud) 在接下来的调用中,optim()我期待一次评估fn()和一次评估gr(),因为maxit=1.然而,fn()和gr()被评价的各7倍.
optim(par=1000, fn=function(x) x^2, gr=function(x) 2*x,
method="L-BFGS-B", control=list(maxit=1))$counts
function gradient
7 7
Run Code Online (Sandbox Code Playgroud)
为什么是这样?这是一个错误吗?或者为什么要optim()对一次迭代进行7次评估?
更详细的输出:
optim(par=1000,
fn=function(x) { cat("f(", x, ")", sep="", fill=TRUE); x^2 },
gr=function(x) { cat("g(", x, ")", sep="", fill=TRUE); 2*x },
method="L-BFGS-B", control=list(maxit=1))$counts
f(1000)
g(1000)
f(999)
g(999)
f(995)
g(995)
f(979)
g(979)
f(915)
g(915)
f(659)
g(659)
f(1.136868e-13)
g(1.136868e-13)
function gradient
7 7
Run Code Online (Sandbox Code Playgroud)
(经R版3.5.0测试.)
定义R函数时,有时会想不到它依赖于封闭环境中的对象。就像是:
a <- 1
fn <- function(x) x + a
Run Code Online (Sandbox Code Playgroud)
如果这是无意发生的,则可能导致难以调试的问题。
有没有简单的方法可以测试是否fn使用封闭环境中的对象?
就像是:
test(fn=fn, args=list(x=1))
## --> uses 'a' from enclosing environment
Run Code Online (Sandbox Code Playgroud) 我想知道迭代求解器是否是求解线性系统(非稀疏,对称,正定)的更快方法。
我试图从R软件包共轭梯度法Rlinsolve和cPCG,但两者似乎比非迭代是不很精确和更慢base::solve()。
library(Rlinsolve)
library(cPCG)
library(microbenchmark)
n <- 2000
A <- tcrossprod(matrix(rnorm(n^2),nrow=n) + diag(rep(10,n)))
x <- rnorm(n)
b <- A%*%x
mean(abs(x - solve(A,b)))
## [1] 1.158205e-08
mean(abs(x - lsolve.cg(A,b)$x))
## [1] 0.03836865
mean(abs(x - cgsolve(A,b)))
## [1] 0.02642611
mean(abs(x - pcgsolve(A,b)))
## [1] 0.02638013
microbenchmark(solve(A, b), lsolve.cg(A, b),
cgsolve(A, b), pcgsolve(A, b), times=5)
## Unit: milliseconds
## expr min lq mean median uq max neval cld
## solve(A, b) 183.3039 188.6678 189.7362 188.8665 189.8514 197.9914 …Run Code Online (Sandbox Code Playgroud) 这是R中的错误还是有意义的?
## works
aa <- matrix(nrow=1,ncol=2)
dimnames(aa)[[2]] <- c("a","b")
dimnames(aa)[[1]] <- c("c")
## does not work
bb <- matrix(nrow=1,ncol=2)
dimnames(bb)[[1]] <- c("c")
Error in dimnames(bb)[[1]] <- c("c") : 'dimnames' must be a list
Run Code Online (Sandbox Code Playgroud)
谢谢你的解释!
r ×11
matrix ×2
mclapply ×2
optimization ×2
debugging ×1
doparallel ×1
environment ×1
function ×1
lapply ×1
list ×1
openblas ×1
performance ×1
testing ×1
venn-diagram ×1