2017-06-22 51 views
-1

请看下面的例子:purrr:无法修改全局列表

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 

现在我用purrr:map2申请一个简单的功能,无论是linkcounter变量。功能如下:

data_list = list() 

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

该列表保持空白。我试图做的仅仅是将每次迭代(read_tmp)存储到全局列表data_list中,以便我稍后在程序中访问。

但是,调用: purrr:map2(test$link, test$counter, ~get_link(.))

不添加任何东西data_list列表。

这里讨厌的范围问题是什么?我以为我正在修改一个在函数外部定义的全局对象...

回答

1

请记住,purrr::map*总是返回一个列表(purrr::map_*变体除外),但是在实现中作用域稍微改变了一些正如我所知。

而且,我不知道你想用代码来完成的话,但我已经改变了get_link功能接收数据列表,并返回一个修改(附加)的版本,如果它,并让代码工作。

下面的代码:

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

返回下面的列表:

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

的感谢!你是否有一些资料来支持你的说法,“但据我所知,实施中的范围有点改变。” –