我想產生一串字符向量像與非嵌套循環在多個列表意外行爲
[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))))
使得例如,
> nletts[["w1"]]
[[1]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
[[2]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
爲了有希望產生看起來像
[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))
}
}
,但顯然這是不對的。爲了使這篇文章有點可讀性,我沒有打印結果,但是你可以運行我已經看到的內容。出於某種原因,它似乎循環了三次而不是一次。我懷疑某個地方是以某種我缺少的方式向量化的,對於我的生活我無法弄清楚它是什麼。我一遍又一遍地重寫了這段代碼大約四個小時,每次都得到完全相同的問題。奇怪的是,我甚至可以用一個整數代替l
,並手工操作以獲得正確的結果。
忘記試圖做我原來的工作,我可能已經完成了三個小時前的副本&粘貼。我只想了解發生了什麼問題。整個事情都讓Hacky和Bad開始,所以我們歡迎其他的建議。
得到它與
for(i in seq_along(vars[["w1"]])){
print(sprintf(vars[["w1"]][i],letters[ nletts[["w1"]][i] ]))
}
工作,但我還是想知道錯了上面什麼地方。我認爲發生了什麼事情是我真的在循環遍歷每個列表元素nletts
兩次。我意識到我的循環嵌套,即使我不想讓它們成爲,所以也許問題在於某處。同時使用相同的索引清楚地解決了問題。
更好的解決方案,不需要append
:
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)
但仍然是哪裏出了問題沒有解釋。
的代碼是不可運行。變量'letts'和'gpavars'沒有定義。所以你只想用一個字母替換「*」?看起來像你應該爲每個變量類型使用'paste()'前綴和後綴。 – MrFlick
'paste0'是你的朋友。 –
'gpavars'應該是'vars'。現在修好。 – shadowtalker