我有一项任务,每周需要很多api调用。我想通过purrr
将所有这些数据和简洁的代码附加在一起,但我在我的函数中很难让Sys.sleep
工作。
下面是一些假数据。我假装这是API后端:
#call 1
week1 <- as_tibble(list(week = rep(1,7),value = rnorm(7,0,1)))
#call 2
week2 <- as_tibble(list(week = rep(2,7),value = rnorm(7,0,1)))
#call 3
week3 <- as_tibble(list(week = rep(3,7),value = rnorm(7,0,1)))
#append
pretend_full_api_data <- bind_rows(week1, week2, week3)
此函数起作用
by_api_call <- function(weeknumber){
weeki <- pretend_full_api_data %>%
filter(week == weeknumber)
}
seq(from = 1, to = 3) %>%
map_df(~by_api_call(.))
问题是API通常需要一段睡眠时间。所以我试着修改如下:
by_api_call <- function(weeknumber){
weeki <- pretend_full_api_data %>%
filter(week == weeknumber)
Sys.sleep(2) #required sleep for API calls
}
seq(from = 1, to = 3) %>%
map_df(~by_api_call(.))
上面的代码返回0 rows
。上面的函数有什么问题?
发布于 2018-06-10 12:46:59
实际上,这是不起作用的,因为函数by_api_call
不会返回任何内容。您需要添加函数return
才能从您的函数中实际检索某些内容。
如果您需要查看技术讨论,请参阅Hadley Wickham (R语言中最有价值的球员)所著的Advanced R一书。
您的代码需要进行这种调整,才能真正完成所需的工作
# API stuff..
# this is the function that actually works...
by_api_call <- function(weeknumber){
weeki <- pretend_full_api_data %>%
filter(week == weeknumber)
Sys.sleep(2) #required sleep for API calls
return(weeki) # return is your friend...
}
# calling the API function
week_numbers <- seq(from = 1, to = 3, by = 1)
(map_df(week_numbers, by_api_call))
https://stackoverflow.com/questions/50777007
复制相似问题