R 多个列表上非嵌套循环的意外行为

R 多个列表上非嵌套循环的意外行为,r,for-loop,vectorization,R,For Loop,Vectorization,我想生成一组字符向量,比如 [1] "w2q5ea" "w2q5eb" "w2q5ec" "w2q5ed" 我有以下设置: vars <- list( w1 = c("w2q5e*","w2q7e*"), w2 = c("w3q9*5","w3q13*5","w3q15*5"), w3 = c("w4q17*c","w4q16*c","w4q15*c"), w4 = c("w5q16*c","w5q14*c","w5q11*c"), w5 = c("w5q8*c"))

我想生成一组字符向量,比如

[1] "w2q5ea" "w2q5eb" "w2q5ec" "w2q5ed"
我有以下设置:

vars <- list(
  w1 = c("w2q5e*","w2q7e*"),
  w2 = c("w3q9*5","w3q13*5","w3q15*5"),
  w3 = c("w4q17*c","w4q16*c","w4q15*c"),
  w4 = c("w5q16*c","w5q14*c","w5q11*c"),
  w5 = c("w5q8*c"))

alphabet <- function(n) lapply(n,function(N) letters[1:N])

nletts <- list(
  w1 = list(unlist(alphabet(10)),unlist(alphabet(10))),
  w2 = list(unlist(alphabet(10)),unlist(alphabet(10)),unlist(alphabet(10))),
  w3 = list(unlist(alphabet(10)),unlist(alphabet(6)),unlist(alphabet(6))),
  w4 = list(unlist(alphabet(6)),unlist(alphabet(6)),unlist(alphabet(6))),
  w5 = list(unlist(alphabet(6))))
为了有希望地生产出

[1] "w2q5ea" "w2q5eb" "w2q5ec" "w2q5ed"
[1] "w2q7ea" "w2q7eb" "w2q7ec" "w2q7ed"
我认为下面的代码就是这么做的:

temp <- list()
for( i in 1:2 ){
letts <- unlist(nletts[["w1"]][[i]])
for(l in seq_along(nletts)) for( v in vars[["w1"]] ) {
        temp <- append(temp,sub("\\*",letts[l],v))
    }
}
但我还是想知道上面出了什么问题。我想发生的事情是,我真的在
nletts
的每个列表元素上循环了两次。我意识到我的循环是嵌套的,尽管我不希望它们是嵌套的,所以问题可能就在那里的某个地方。同时使用相同的索引显然解决了这个问题


不需要追加
的更好解决方案:

whatever <- sapply(1:5, function(w){
    sapply( seq_along(vars[[w]]), function(i){
        sprintf(vars[[w]][i],letters[ 1:nletts[[w]][i] ] )
    },simplify=F)
},simplify=F)

随便试试这个食谱怎么样:

R> vars <- c("w2q5e%s", "w5q8%sc")
R> lapply(vars, function (x) sprintf(x, letters))
[[1]]
 [1] "w2q5ea" "w2q5eb" "w2q5ec" "w2q5ed" "w2q5ee" "w2q5ef" "w2q5eg" "w2q5eh" "w2q5ei"
[10] "w2q5ej" "w2q5ek" "w2q5el" "w2q5em" "w2q5en" "w2q5eo" "w2q5ep" "w2q5eq" "w2q5er"
[19] "w2q5es" "w2q5et" "w2q5eu" "w2q5ev" "w2q5ew" "w2q5ex" "w2q5ey" "w2q5ez"

[[2]]
 [1] "w5q8ac" "w5q8bc" "w5q8cc" "w5q8dc" "w5q8ec" "w5q8fc" "w5q8gc" "w5q8hc" "w5q8ic"
[10] "w5q8jc" "w5q8kc" "w5q8lc" "w5q8mc" "w5q8nc" "w5q8oc" "w5q8pc" "w5q8qc" "w5q8rc"
[19] "w5q8sc" "w5q8tc" "w5q8uc" "w5q8vc" "w5q8wc" "w5q8xc" "w5q8yc" "w5q8zc"
R>变量lappy(变量,函数(x)sprintf(x,字母))
[[1]]
[1] “w2q5ea”“w2q5eb”“w2q5ec”“w2q5ed”“w2q5ee”“w2q5ef”“w2q5eg”“w2q5eh”“w2q5ei”
[10] “w2q5ej”“w2q5ek”“w2q5el”“w2q5em”“w2q5en”“w2q5eo”“w2q5ep”“w2q5eq”“w2q5er”
[19] “w2q5es”“w2q5et”“w2q5eu”“w2q5ev”“w2q5ew”“w2q5ex”“w2q5ey”“w2q5ez”
[[2]]
[1] “w5q8ac”“w5q8bc”“w5q8cc”“w5q8dc”“w5q8ec”“w5q8fc”“w5q8gc”“w5q8hc”“w5q8ic”
[10] “w5q8jc”“w5q8kc”“w5q8lc”“w5q8mc”“w5q8nc”“w5q8oc”“w5q8pc”“w5q8qc”“w5q8rc”
[19] “w5q8sc”“w5q8tc”“w5q8uc”“w5q8vc”“w5q8wc”“w5q8sc”“w5q8yc”“w5q8zc”

代码无法运行。未定义变量
letts
gpavar
。那么你只想用一个字母替换“*”吗?似乎您应该使用带有前缀和后缀的
paste()
paste0
是您的朋友。
gpavars
应该是
vars
。现在修复了。@RicardoSaporta我一直在使用
sprintf()
,但你是对的:
paste()
的矢量化方式更加透明。我与
paste0()
有一段时间是好朋友,但这些字符与'eval(parse())的关系也很糟糕。这是我最初应该想到的解决方案。只需第一次运行
lappy(vars,sub(“\\*”,“%s”,x)
+1但我不打算将此标记为答案,因为我主要想了解我的代码不起作用的原因。实际上,这并不能解决问题,因为我想为
vars
的每个元素使用不同数量的字母。因此,我仍然必须为
vars的每个元素使用不同的
字母子集ode>@ssdecontrol:我只想给你看配方。使用一些应用程序可以轻松处理不同的字母集。好吧,用
字母[1:n]替换
字母
和循环使用
n
的值给了我与以前相同的问题。如果要使用不同数量的字母,请使用
mapply
而不是
lappy
whatever <- sapply(1:5, function(w){
    sapply( seq_along(vars[[w]]), function(i){
        sprintf(vars[[w]][i],letters[ 1:nletts[[w]][i] ] )
    },simplify=F)
},simplify=F)
R> vars <- c("w2q5e%s", "w5q8%sc")
R> lapply(vars, function (x) sprintf(x, letters))
[[1]]
 [1] "w2q5ea" "w2q5eb" "w2q5ec" "w2q5ed" "w2q5ee" "w2q5ef" "w2q5eg" "w2q5eh" "w2q5ei"
[10] "w2q5ej" "w2q5ek" "w2q5el" "w2q5em" "w2q5en" "w2q5eo" "w2q5ep" "w2q5eq" "w2q5er"
[19] "w2q5es" "w2q5et" "w2q5eu" "w2q5ev" "w2q5ew" "w2q5ex" "w2q5ey" "w2q5ez"

[[2]]
 [1] "w5q8ac" "w5q8bc" "w5q8cc" "w5q8dc" "w5q8ec" "w5q8fc" "w5q8gc" "w5q8hc" "w5q8ic"
[10] "w5q8jc" "w5q8kc" "w5q8lc" "w5q8mc" "w5q8nc" "w5q8oc" "w5q8pc" "w5q8qc" "w5q8rc"
[19] "w5q8sc" "w5q8tc" "w5q8uc" "w5q8vc" "w5q8wc" "w5q8xc" "w5q8yc" "w5q8zc"