Description
This is a similar issue to that raised by #5189 that @hadley closed. Since that issue didn't have a reprex, and this is an issue which didn't previously exist using this code with this API, I think it's worth another look.
@DavisVaughan replied here that advising the API to fix the NULL might be one course of action #5189 (comment)
This is previously functional code that now seems to throw an error when an API provides variables that are read as NULL, as I can no longer use bind_rows to move from a list to a data frame. Previous iterations of this code worked fine, so not sure what the change is - as far as I can tell, the API was not altered from previous versions. The last time I know for sure that this code ran without this error was early 2019, and I am only just revisiting it now for a new project.
A quick reproduction of the error:
library(httr)
library(tidyverse)
#reproducible example with a form from Kent Marketing Petroleum Survey
# The code is used recursively build the set of feasible options in a series of drop-down menus from
https://charting.kentgroupltd.com/
kent_report_types<-function(product_id=1){
# for testing, use product_id=1
#product_id=1
#For Each Product ID, get a report type
#Product Report Types
report_types<-content(POST(
url = "https://charting.kentgroupltd.com/Charting/GetReportTypes",
query = list(
ProductID= product_id
)
))
#what I used to be able to do and would like to be able to do again
#report_types %>% bind_rows() %>% filter(Value!=0)
#now, that creates this error
#> report_types %>% bind_rows() %>% filter(Value!=0)
#Error: Internal error in `vec_slice_impl()`: Unexpected `NULL`.
# Run `rlang::last_error()` to see where the error occurred.
# what I have to do now to work around it
text<-sapply(report_types, function(x) x[[4]])
value<-sapply(report_types, function(x) x[[5]])
report_types<-tibble(text,value) %>% filter(value!=0) %>% mutate(product_id=product_id)
report_types
}
#run the function
kent_report_types(1)
As far as I can tell, the API has not changed from when I wrote the original version of this code using bind_rows, but the API definitely sends a NULL variable:
I'd welcome any suggestions of a better work-around or a way to omit the NULL types from the list at reading.