0

Kinda long winded but here goes:

I have a dataframe like this:

testprotocols<-structure(list(protocol_no = c("LS-P-Joe's API", "JoeTest3"), 
    nct_number = c(654321, 543210), library = structure(c(2L,
    2L), levels = c("General Research", "Oncology"), class = "factor"),
    organizational_unit = structure(c(1L, 1L), levels = c("Lifespan Cancer Institute", 
    "General Research"), class = "factor"), title = c("Testing to see if basic stuff came through",
    "Testing Oncology Projects for API"), department = structure(c(2L,
    2L), levels = c("Diagnostic Imaging", "Lifespan Cancer Institute"
    ), class = "factor"), protocol_type = structure(2:1, levels = c("Basic Science",
    "Other"), class = "factor"), protocolid = 1:2), row.names = c(NA,
-2L), class = c("tbl_df", "tbl", "data.frame"))

I want to push it into a website using an API with this code, that'll go line by line and return a dataframe given me the status of whether or not that row worked:

##This chunk gets a random one we're going to change later
base <- "https://website.forteresearchapps.com"
endpoint <- "/website/rest/protocols/"
protocol <- "2501"

## 'results' will get changed later to plug back in


## store
protocolid <- protocolnb <- library_names <- get_codes <- put_codes <- list()

UpdateAccountNumbers <- function(protocol){
  call2<-paste(base,endpoint, protocol, sep="")   
httpResponse <- GET(call2, add_headers(authorization = token))
results = fromJSON(content(httpResponse, "text"))


results$protocolId<- "8887"  ## doesn't seem to matter
results$protocolNo<- testprotocols$protocol_no
results$library<- as.character(testprotocols$library)
results$title<- testprotocols$title
results$nctNo<-testprotocols$nct_number
results$objectives<-"To see if the API works, specifically if you can write over a previous number"
results$shortTitle<- "Short joseph Title"
results$nctNo<-testprotocols$nct_number
results$department <- as.character(testprotocols$department)
results$organizationalUnit<- as.charater(testprotocols$organizational_unit)
results$protocolType<- as.character(testprotocols$protocol_type)

  call2 <- paste(base,endpoint, protocol, sep="") 

  httpResponse_put <- PUT(
    call2, 
    add_headers(authorization = token), 
    body=results, encode = "json", 
    verbose()
  )

  # save stats 
  protocolid <- append(protocolid, protocol)
  protocolnb <- append(protocolnb, testprotocols$PROTOCOL_NO[match(protocol, testprotocols$PROTOCOL_ID)])
  library_names <- append(library_names, testprotocols$LIBRARY[match(protocol, testprotocols$PROTOCOL_ID)])
  get_codes <- append(get_codes, status_code(httpResponse_get))
  put_codes <- append(put_codes, status_code(httpResponse_put))
}
## Oncology will have to change to whatever the df name is, above and below this
purrr::walk(testprotocols$protocol_no, UpdateAccountNumbers)

allresults <- tibble('protocolNo'=unlist(protocol_no),'protocolnb'=unlist(protocolnb),'library_names'=unlist(library_names), 'get_codes'=unlist(get_codes), 'put_codes'=unlist(put_codes) )

This basic gist of purrr loop is from my question here: Question

The only difference is that in that question, I was only doing one small change within the loop, this line:

results$hospitalAccountNo <- results$internalAccountNo

Where it would take what it downloaded from the API, copy it over to 'hospitalAccountNo' and put it back up.

This time around, I'm trying to make a few more changes: all of these lines which I envision using the 'testprotocols' dataframe and writing over the 'results' it downloaded, then uploading one row at a time using the loop.

results$protocolId<- "8887"  ## doesn't seem to matter
results$protocolNo<- testprotocols$protocol_no
results$library<- as.character(testprotocols$library)
results$title<- testprotocols$title
results$nctNo<-testprotocols$nct_number
results$objectives<-"To see if the API works, specifically if you can write over a previous number"
results$shortTitle<- "Short joseph Title"
results$nctNo<-testprotocols$nct_number
results$department <- as.character(testprotocols$department)
results$organizationalUnit<- as.charater(testprotocols$organizational_unit)
results$protocolType<- as.character(testprotocols$protocol_type)

For whatever reason, when I try to run the line:

purrr::walk(testprotocols$protocol_no, UpdateAccountNumbers)

enter image description here

If I run traceback() I get this:

enter image description here

I'd love it if someone could just fix my entire loop for me haha, but realistically my question is:

Where should I look to figure out what is causing this error?

Joe Crozier
  • 944
  • 8
  • 20
  • 1
    Use `traceback()` to see the call stack when the error occurred. Sounds like the error is coming from `results = fromJSON(content(httpResponse, "text"))` and specifically for some value the server is not returning JSON data but an HTML page (maybe with some warning or error message). – MrFlick Aug 24 '22 at 17:50
  • Thank you. Did so and will update the question with the traceback info. To be honest its still kinda gibberish to me but it does sound like you were on the right track with your hunch. – Joe Crozier Aug 24 '22 at 18:22

0 Answers0