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
这是一个已知问题,请参见此处:

已知的问题可以通过Hadley的例子得到最好的证明:

>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”)
参见此处: