2014-06-18 58 views
0

我想產生一串字符向量像與非嵌套循環在多個列表意外行爲

[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) 

但仍然是哪裏出了問題沒有解釋。

+0

的代碼是不可運行。變量'letts'和'gpavars'沒有定義。所以你只想用一個字母替換「*」?看起來像你應該爲每個變量類型使用'paste()'前綴和後綴。 – MrFlick

+0

'paste0'是你的朋友。 –

+0

'gpavars'應該是'vars'。現在修好。 – shadowtalker

回答

1

如何嘗試這個偏方:

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" 
+0

保持了很糟糕的公司。這是我本來應該提出的解決方案。首先運行'lapply(vars,sub(「\\ *」,「%s」,x)'。+ 1,但我不會將其標記爲答案,因爲我主要想了解爲什麼我的代碼不會' t工作 – shadowtalker

+0

其實這並不能解決問題,因爲我想爲'vars'的每個元素使用不同數量的字母,所以我仍然必須爲'varars的每個元素使用'letters'的不同子集' – shadowtalker

+0

@ssdecontrol:我只想給你看看配方,有不同的字母組合很容易用一些應用程序來處理。 – asb