2017-06-22 4 views
-1

Betrachten Sie das folgende Beispiel ändern:purrr: unable globale Liste

test <- data_frame(link = c('https://commons.wikimedia.org/wiki/Main_Page', 'https://commons.wikimedia.org/wiki/Category:Society'), 
             counter = c(1,2)) 
> test 
# A tibble: 2 x 2 
               link counter 
               <chr> <dbl> 
1  https://commons.wikimedia.org/wiki/Main_Page  1 
2 https://commons.wikimedia.org/wiki/Category:Society  2 

jetzt ich purrr:map2 verwenden, um eine einfache Funktion sowohl für die link und die counter Variable anzuwenden. Die Funktion ist wie folgt:

data_list = list() 

get_link <- function(link, counter){ 
    read_tmp <- read_html(link) 
    data_list[[counter]] <- read_tmp 
} 

Die Liste leer bleibt. Was ich versuche, ist einfach zu speichern-bei jeder Iteration read_tmp in eine globale Liste data_list, auf die ich später im Programm zugreifen möchte.

jedoch Aufruf: purrr:map2(test$link, test$counter, ~get_link(.))

fügt nichts hinzu auf die data_list Liste.

Was ist das böse Scoping-Problem hier? Ich dachte, dass ich ein globales Objekt ändern, die außerhalb der Funktion definiert wurde ...

Antwort

1

Beachten Sie, dass purrr::map* immer eine Liste zurückgibt (mit Ausnahme der purrr::map_* Variation), aber die Scoping ein Bit in der Umsetzung geändert, so weit wie ich weiß.

Auch ich bin mir nicht sicher, was Sie mit dem Code erreichen wollen, aber ich habe die get_link Funktion geändert, um eine Datenliste zu erhalten und eine modifizierte (angehängte) Version von If zurückzugeben und den Code arbeiten zu lassen .

Der folgende Code:

library(rvest) 

test <- data_frame(link = c('https://commons.wikimedia.org/wiki/Main_Page', 
          'https://commons.wikimedia.org/wiki/Category:Society'), 
        counter = c(1,2)) 


get_link <- function(link, counter, data_list){ 
    read_tmp <- read_html(link) 
    data_list[[counter]] <- read_tmp 
    data_list 
} 


data_list <- list() 

purrr::map2(test$link, test$counter, ~get_link(.x, .y, data_list)) 

Gibt die folgende Liste:

[[1]] 
[[1]][[1]] 
{xml_document} 
<html class="client-nojs" lang="en" dir="ltr"> 
    [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n<me ... 
[2] <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Ma ... 


[[2]] 
[[2]][[1]] 
NULL 

[[2]][[2]] 
{xml_document} 
<html class="client-nojs" lang="en" dir="ltr"> 
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n<me ... 
[2] <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-14 ns-subject page-C ... 
+0

Dank! Verfügen Sie über einige Quellen, um Ihre Behauptung zu untermauern, dass "das Scoping bei der Implementierung ein wenig geändert wurde, soweit mir bekannt ist"? –