2017-09-07 4 views
1

私はクラスbtのリストを持っていて、クラスbt_listのリストを含むことができ、bt_listの要素をアンネッシュしたいことがあります。以下の例は私が望むことをしますが、コードは醜いです。成功しなかったrapplyおよびpurrr突然変異体のいくつかの変異体を試した。何か案は?リストを部分的にネスト解除する

# Generate data 
el = function(){ 
    a = rnorm(runif(10 + 3)) 
    class(a) = "bt" 
    a 
} 

ell = list(el(), el()) 
class(ell) = "bt_list" 

d = list(el(), el(), ell) 
str(d) 

# Unpack the list in data 
ret = list() 
i = 1 
for (dd in d) { 
    if (is(dd, "bt_list")) 
    { 
    for (d in dd) { 
     ret[[i]] = d 
     i = i + 1 
    } 
    } else { 
    ret[[i]] = dd 
    i = i + 1 
    } 
} 

str(ret) 

答えて

1

Aわずかにハックアプローチ:同じレベルにネストすべて、次いでpurrr::flattenを使用する:ここ

library(purrr) 

d %>% modify_if(Negate(is.list), list) %>% flatten() %>% str() 
#> List of 4 
#> $ :Class 'bt' num [1:13] -0.4432 -0.8113 0.0909 1.5127 -1.1452 ... 
#> $ :Class 'bt' num [1:13] -0.222 -0.3307 -0.0342 -0.0497 -1.3101 ... 
#> $ :Class 'bt' num [1:13] 1.004 -0.146 0.325 0.307 0.389 ... 
#> $ :Class 'bt' num [1:13] -0.327 1.434 -1.187 0.759 1.193 ... 
+0

Clever。私がこれを受け入れるまで数分待たなければならない。 modify_ifが私の画面になかったようです。 –

+0

これは主に 'map_if'の名前変更です(現在はまだ存在していますが)。classを保持するので、data.framesや他のオブジェクトで非破壊的に使うことができます。 – alistaire

1

lapply有する基地R法です。要素がリストであるかどうかをチェックします(yesの場合は要素を返し、存在しない場合は要素を含む長さ1のリストを返します)。次に、再帰的= FALSEのunlistがそれに供給され、リストをネスト解除します。このコードは、例のように最大深度2のリストに対して機能することに注意してください。この再帰的に実装する方法があると思われますが、ここでは試しません。

unlist(lapply(d, function(x) if(is.list(x)) x else list(x)), recursive=FALSE) 
[[1]] 
[1] 0.9066792 -1.3454847 -0.8537010 1.3674898 -1.2739962 -0.6985093 -1.2859386 1.4084817 
[9] -0.7793395 -1.4975101 -1.0413126 1.0787356 -0.3256806 
attr(,"class") 
[1] "bt" 

[[2]] 
[1] -0.570994422 1.097478529 0.682345735 -0.260428116 0.354880308 1.114958954 
[7] -1.025245415 -0.391107246 0.008361003 0.246687656 1.083959863 -2.071394617 
[13] -0.717595486 
attr(,"class") 
[1] "bt" 

[[3]] 
[1] -1.1984306 0.9337199 -0.6019184 -2.4940949 -1.3929918 1.4996909 0.1669178 1.7971318 
[9] 1.4406508 1.5093291 -0.8680647 -0.3412633 -0.4315870 
attr(,"class") 
[1] "bt" 

[[4]] 
[1] -1.05771596 -1.25278104 -1.35396929 1.96866094 -1.88897210 1.54753633 -0.20623455 
[8] 1.26695133 -1.27460182 0.96117381 0.14783072 0.93768848 0.03364427 
attr(,"class") 
[1] "bt" 
+0

それはいいです、私のケースでは、より深いネスティングはありません。 –

関連する問題