इस जटिल और नेस्टेड उदाहरण पर विचार करें (जो, मेरे डेटासेट में वास्तविक रूप से उत्पन्न होता है या नहीं)

> nestedlist <- list(list('fakedata' = 'hello',
+                    list(list('name'= list('john','litz'), 'age'= 30))),
+                    list('fakedata' = 'there',
+                    list(list('name'= list('frank','doe'), 'age'= 34))))
> 
> nestedlist %>% str
List of 2
 $ :List of 2
  ..$ fakedata: chr "hello"
  ..$         :List of 1
  .. ..$ :List of 2
  .. .. ..$ name:List of 2
  .. .. .. ..$ : chr "john"
  .. .. .. ..$ : chr "litz"
  .. .. ..$ age : num 30
 $ :List of 2
  ..$ fakedata: chr "there"
  ..$         :List of 1
  .. ..$ :List of 2
  .. .. ..$ name:List of 2
  .. .. .. ..$ : chr "frank"
  .. .. .. ..$ : chr "doe"
  .. .. ..$ age : num 34

मैं इससे तत्वों को निकालने के लिए purrr का उपयोग करने का प्रयास कर रहा हूं। fakedata फ़ील्ड को निकालने जैसा कुछ आसान काम आसानी से करता है:

> purrr::map(nestedlist, 'fakedata')
[[1]]
[1] "hello"

[[2]]
[1] "there"

हालांकि, मुझे name फ़ील्ड में दिलचस्पी है। और इस मामले में मेरा purrr समाधान काम नहीं करता है:

> purrr::map(nestedlist, list(1,1,'name')) 
[[1]]
NULL

[[2]]
NULL

यहाँ क्या मुद्दा है? धन्यवाद!

2
ℕʘʘḆḽḘ 6 नवम्बर 2020, 22:52

2 जवाब

सबसे बढ़िया उत्तर

मैं purrr::pluck() के उपयोग का सुझाव देने जा रहा था, फिर मुझे पता चला कि आप वास्तव में केवल purrr::map() का उपयोग कर सकते हैं।

आप बहुत करीब हैं: आपको एक कैरेक्टर वेक्टर के बजाय map() तक एक्सेसर्स की एक सूची पास करने की आवश्यकता है, और एक एक्सेसर है जिसे आपने याद किया है।

nestedlist %>% map( list('data', 1, 'name') )

[[1]]
[[1]][[1]]
[1] "john"

[[1]][[2]]
[1] "litz"


[[2]]
[[2]][[1]]
[1] "frank"

[[2]][[2]]
[1] "doe"
1
Greg Foletta 6 नवम्बर 2020, 23:15

एक अन्य विकल्प rrapply() को rrapply-पैकेज (आधार का एक विस्तार rapply()) में उपयोग करना है, जो इस उद्देश्य के लिए बिल्कुल बनाया गया है:

library(rrapply)   ## v1.2.1

## filter 'name' nodes as flat list
str(rrapply(nestedlist, classes = "list", condition = function(x, .xname) .xname == "name", how = "flatten"))
#> List of 2
#>  $ name:List of 2
#>   ..$ : chr "john"
#>   ..$ : chr "litz"
#>  $ name:List of 2
#>   ..$ : chr "frank"
#>   ..$ : chr "doe"


## prune 'name' nodes maintaining list structure
str(rrapply(nestedlist, classes = "list", condition = function(x, .xname) .xname == "name", how = "prune"))
#> List of 2
#>  $ :List of 1
#>   ..$ :List of 1
#>   .. ..$ :List of 1
#>   .. .. ..$ name:List of 2
#>   .. .. .. ..$ : chr "john"
#>   .. .. .. ..$ : chr "litz"
#>  $ :List of 1
#>   ..$ :List of 1
#>   .. ..$ :List of 1
#>   .. .. ..$ name:List of 2
#>   .. .. .. ..$ : chr "frank"
#>   .. .. .. ..$ : chr "doe"
1
Joris C. 7 नवम्बर 2020, 16:36