r语言 - paste0()更改日期格式



我找不到这样的副本,但我无法想象我是唯一一个遇到这种问题的人。

我正试图从API中提取一些数据,迭代链接中的日期。我在我的GET()中使用paste0(),这似乎是我问题的根源。我在下面包含了一些示例代码来演示我是如何设置代码的。我还运行了一个for循环来打印代码正在做什么,并发现以不同的格式粘贴了日期。API需要YYYY-MM-DD格式的日期,正如我在这里的第一行代码中所做的那样。

当前代码结构

date <- seq(as.Date("2021-01-01"), as.Date("2021-02-13"), by = "days")
> date
[1] "2021-01-13" "2021-01-14" "2021-01-15"
[4] "2021-01-16" "2021-01-17" "2021-01-18"
[7] "2021-01-19" "2021-01-20" "2021-01-21"
[10] "2021-01-22" "2021-01-23" "2021-01-24"
[13] "2021-01-25" "2021-01-26" "2021-01-27"
[16] "2021-01-28" "2021-01-29" "2021-01-30"
[19] "2021-01-31" "2021-02-01" "2021-02-02"
[22] "2021-02-03" "2021-02-04" "2021-02-05"
[25] "2021-02-06" "2021-02-07" "2021-02-08"
[28] "2021-02-09" "2021-02-10" "2021-02-11"
[31] "2021-02-12"
for(i in date){
data <- GET(paste0('https://API_Address/', i,'/More_API_Address')),
authenticate(user = 'user_name', password = 'my_password')
)

data_content <- content(data)
}

打印出这里发生的事情

for(i in date){
print(paste0("paste0('https://API_Address/',", i,"'/More_API_Address')), authenticate(user = 'user_name', password = 'my_password')")

}
[1] "'paste0('https://API_Address/',18640'/More_API_Address'), authenticate(user = 'user_name', password = 'my_password')"
[1] "'paste0('https://API_Address/',18641'/More_API_Address'), authenticate(user = 'user_name', password = 'my_password')"
[1] "'paste0('https://API_Address/',18642'/More_API_Address'), authenticate(user = 'user_name', password = 'my_password')"
....

我测试了一些单独的日期,一切似乎都在工作。有没有更好的方法来迭代这些日期?

理想的输出API端点是这样的:https://API_Address/2021-01-01/More_API_Address

选项可以是

for(i in as.character(date)){
print(paste0("paste0('https://API_Address/',", i,"'/More_API_Address')), authenticate(user = 'user_name', password = 'my_password')"))
}

as.character将强制整个向量,这是一个一站式的解决方案,其他任何东西都不需要更改。

我们可以使用sprintf来创建链接

links1 <- sprintf('https://API_Address/%s/More_of_API_Address', date)
head(links1)
#[1] "https://API_Address/2021-01-01/More_of_API_Address" "https://API_Address/2021-01-02/More_of_API_Address"
#[3] "https://API_Address/2021-01-03/More_of_API_Address" "https://API_Address/2021-01-04/More_of_API_Address"
#[5] "https://API_Address/2021-01-05/More_of_API_Address" "https://API_Address/2021-01-06/More_of_API_Address"

然后循环链接并应用GET

out <- vector('list', length(date))
for(i in seq_along(out)){
tmp <- GET(links1[i],
authenticate(user = 'user_name', password = 'my_password'))
out[[i]] <- content(tmp)
}

或者另一个选择是使用lapply

out1 <- lapply(links1, function(link) {
tmp <- GET(link, authenticate(user = 'user_name',
password = 'my_password'))
content(tmp)
})

paste

links1 <- paste0('https://API_Address/', date, '/More_of_API_Address')

注意:sprintfpaste都是矢量化的。所以,我们不需要循环到paste。在OP的帖子中,paste0(也包含在字符串

中。

最新更新