R 转换日期对象列表的赋值与函数中返回值的赋值不同
我有一个函数,它通过从国际田联田径官方网页上删除的网页,返回运动员的许多属性,其中一个是他们的出生日期。为了回答这个问题,我对它做了一些修改:R 转换日期对象列表的赋值与函数中返回值的赋值不同,r,list,function,web-scraping,rvest,R,List,Function,Web Scraping,Rvest,我有一个函数,它通过从国际田联田径官方网页上删除的网页,返回运动员的许多属性,其中一个是他们的出生日期。为了回答这个问题,我对它做了一些修改: upscope_list <- list() library(xml2) library(tidyverse) library(stringi) library(rvest) scrape_function_mod <- function(athlete_name) { starting_name <- stri_tran
upscope_list <- list()
library(xml2)
library(tidyverse)
library(stringi)
library(rvest)
scrape_function_mod <- function(athlete_name) {
starting_name <- stri_trans_general(athlete_name, "latin-ascii")
initial_url <-
paste0("https://www.iaaf.org/athletes/search?query=", starting_name)
initial_search_page <- read_html(initial_url)
rawnodes_text <-
initial_search_page %>% html_nodes("table td") %>% html_text(trim = T) %>% stri_trans_general("latin-ascii")
name_split <- as_vector(strsplit(starting_name, " ", fixed = T))
number <- which(sapply(rawnodes_text, function(x)
grepl(name_split[1], x, ignore.case = T) &
grepl(name_split[length(name_split)], x, ignore.case = T)))
upscope_list[[athlete_name]][["birth_date"]] <<-
rawnodes_text[(number + 4)] %>% as.Date("%d %B %Y")
return(rawnodes_text[(number + 4)] %>% as.Date("%d %B %Y"))
}
这将返回运动员出生日期的正确日期对象,但是我在开始时创建的列表中插入的值不同,返回的是一个我无法理解的数字四位数
> upscope_list[["Ashton Eaton"]][["birth_date"]]
[1] 6594
您可以看到,我分配给列表的内容与我返回的内容应该基本相同,但事实并非如此。在函数中正确转换日期的任何提示?如注释中所述,您的日期已转换为数字
> as.numeric(as.Date("1988-01-21"))
[1] 6594
这是一个已知问题,请参见此处:
>x x[[1]]
[1] "1988-01-21"
>x[[c(1,1)]]
[1] 6594
正如您在线程中所看到的,该问题在
purr
r`中针对pmap
得到了解决。您可以切换到该包,或者您可以用不同的方式分配变量为了理解确切的问题,让我们举一个简单的例子。
考虑一个列表abc
,让我们分配一个名为var1
案例1:
abc <- list()
abc[["var1"]] <- Sys.Date()
abc
#$var1
#[1] "2019-11-28"
abc <- list()
abc[["var1"]][["var2"]] <- Sys.Date()
abc
#$var1
# var2
#18228
abc <- list()
abc[["var1"]] <- list()
abc[["var1"]][["var2"]] <- Sys.Date()
abc
#$var1
#$var1$var2
#[1] "2019-11-28"
abc <- list()
abc[["var1"]][["var2"]] <- c(Sys.Date(), Sys.Date())
abc
#$var1
#$var1$var2
#[1] "2019-11-28" "2019-11-28"
现在让我们再深入一层
案例2:
abc <- list()
abc[["var1"]] <- Sys.Date()
abc
#$var1
#[1] "2019-11-28"
abc <- list()
abc[["var1"]][["var2"]] <- Sys.Date()
abc
#$var1
# var2
#18228
abc <- list()
abc[["var1"]] <- list()
abc[["var1"]][["var2"]] <- Sys.Date()
abc
#$var1
#$var1$var2
#[1] "2019-11-28"
abc <- list()
abc[["var1"]][["var2"]] <- c(Sys.Date(), Sys.Date())
abc
#$var1
#$var1$var2
#[1] "2019-11-28" "2019-11-28"
现在,当你调用函数时,你会得到
scrap_function_mod("Ashton Eaton")
#[1] "1988-01-21"
upscope_list[["Ashton Eaton"]][["birth_date"]]
#[1] "1988-01-21"
好的,我刚刚意识到这个数字表示自1970年1月1日Unix/Epoch时间以来的天数。我仍然不知道为什么它会转换成这样。对于赏金,我很感兴趣,同时也对这种转换发生的理论原因感兴趣。与日期作为S3对象有关吗?它只是一个数值:
as.numeric(as.Date(“1988-01-21”)
参见此处: