R用jsonlite编织 - 适用于R Markdown但不适用于编织

时间:2017-02-28 18:03:14

标签: json r knitr

我从R Mark下来了一个成功的针织文件。然后我修改了两个与错误完全无关的单元格。突然间,我第二次打电话给jsonlite吵醒编织过程时出现问题,如下所示:

line 165:  Error in open.connection(con, "rb"): Couldn't connect to server 
Calls: <anonymous ... fromJSON_String -> parseJSON -> parse_con -> open -> 
open.connection

检查源代码,较早的单元格具有进行json调用的函数。测试功能的单元格编织得很好。在循环中重新使用函数的单元格2进行一堆json调用(它们之间有3.7秒的延迟)不是编织。代码有效。甚至以前编织过。现在它抛出一个错误。

我的直觉是这是一个随机的性能问题,但它现在反复失败,这种行为违背了我的逻辑。我可以运行代码,它在每个单元格中都能正常工作。我检查了我的单元格声明语法,寻找可以绊倒编织的故障,但我找不到任何错误。代码太大而不能完整地呈现在这里,所以下面只是来自降价文档的相关单元格,编织时有效的单元格(其中有jsonlite)和紧接其后的单元格,即使虽然触发编织错误代码工作正常。

该文件现在赢得了我的最新修改。任何关于如何摆脱扭曲以重新编辑本文档的想法或有用的建议将不胜感激:

这个单元格运行并编织得很好:

```{r p5jLiteAns, message=FALSE, warning=FALSE}
# sample ids: tt0120737, tt0468569

library(curl)
library(jsonlite)

get_json_movieRecord <- function(movieID, showRequest=FALSE) {
  movieURL_start <- "http://www.omdbapi.com/?i="
  movieURL_end <- "&plot=short&r=json&tomatoes=true"
  moovURL <- paste0(movieURL_start, movieID, movieURL_end)
  if (showRequest == TRUE) {
    print(paste("Sending request: ", moovURL)) 
  }
  as.data.frame(jsonlite::fromJSON(moovURL), stringsAsFactors=FALSE)
}

# build initial data frame from first record:
movE_data <- get_json_movieRecord(IMDB_mvIDs[1,], TRUE)
movE_data[ ,1:6]
print(paste0("Num Cols: ", NCOL(movE_data)))

```

此单元格会触发错误。第165行与开始for循环的行相关,因此它可能会在函数调用中阻塞,从而使json调用它:

```{r p5getDatawDelay}

for (i in 2:250) {
  # declared ahead of the loop and then added to within the loop
  # in theory, this should yield better performance:

  movE_data <- rbind(movE_data, get_json_movieRecord(IMDB_mvIDs[i,]))
  if (i %% 2 == 0) {   # Add delay to every other request ...

    cDelayRtn <- causeDelay(3.7)

  }
}

write.csv(movE_data, file='IMDB_Top250_OMDB_Detailed.csv')
movE_data[1:6, 1:6]
paste0("Number Rows: ", NROW(movE_data))
paste0("Number Cols: ", NCOL(movE_data))

```

为了完整性......上面的代码对一个具有此延迟功能的早期单元格进行函数调用:

```{r p5addTimeDelayFunc, echo=T, eval=T}

causeDelay <- function(x, showDelay = FALSE)
{
  p1 <- proc.time()
  Sys.sleep(x) # nothing happens for x seconds
  if (showDelay == TRUE) {
    proc.time() - p1
  }
} 
print("Text")
causeDelay(3.7, TRUE)
print("Text after delay.")
print("")
print("Text2")
causeDelay(3.7)
print("Text after delay.")

```

1 个答案:

答案 0 :(得分:1)

我想我可能会在这里看到答案。我在2次或3次编织尝试时得到了相同的错误,并且每次尝试需要10分钟以上才能达到错误点,这不是您想要多次执行的过程。但在进行了表面编辑(删除评论)之后,再次点击编织按钮会导致出现新的错误,这与本文中显示的不同。

此降价文档的完整代码需要花费一个小时或更长时间才能点击并重新运行每个单元格+时间以重新编织。即使每个单元格都是从之前的成功尝试中运行的(并且输出仍然在markdown文档中可见),我现在怀疑某些内容不再被正确缓存。解决方案可能就是:重新运行每个单元格,然后再次重新尝试RStudio编织按钮。

如果有人在这种情况下知道其他事情,请发帖。否则,我正在寻找一个漫长的过程,我将在我赶上其他工作之后开始。