我從我的R馬克下來了一個成功的針織文件。然後我修改了兩個與錯誤完全無關的單元。突然間,我正在一個問題,我的第二次調用jsonlite如本錯誤絆倒了針織過程:R針織與jsonlite - 作品在R Markdown,但不在編織
line 165: Error in open.connection(con, "rb"): Couldn't connect to server
Calls: <anonymous ... fromJSON_String -> parseJSON -> parse_con -> open ->
open.connection
檢查源代碼,早期的細胞具有的功能,使通話JSON。細胞測試功能編織好。單元格二重複使用循環中的函數來創建一堆json調用(它們之間有3.7秒的延遲)不是編織。代碼起作用。甚至以前編織過。現在它會拋出一個錯誤。
我的直覺是,這是一個隨機的性能問題,但它現在一再失敗和行爲不符合邏輯給我。我可以運行代碼,它在每個單元格中工作正常。我已經檢查過我的單元格聲明語法,尋找可以跳出編織的故障,但我找不到任何錯誤。該代碼太大而無法呈現在此處,因此下面僅僅是來自markdown doc的相關單元格,它是針織(其中包含jsonlite)時起作用的單元格,以及緊接着它後觸發編織錯誤的單元格代碼工作正常。
文檔現在不會編織,讓我的最新變化。如何搖出扭結到reknit本文檔的任何意見或有幫助的建議,將不勝感激:
這種電池運行和針織罰款:
```{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.")
```
通常情況下,如果我有非常長時間的操作,我能負擔得起做針織「外」(而不想與緩存混亂),我會得到的對象保存到一個文件.Rdata。然後,我將在代碼塊中調用load(「thingy.Rdata」)'。它有點膽小,但爲我節省了很多時間和頭痛。 –
不知道這將如何幫助當前hic。如果我理解你的建議,它可以幫助未來。首先,我必須解決所有問題。然後,一旦我得到乾淨的產出,編織得很好,我應該把它保存下來。Rdata文件然後將該文件的load()添加到我的代碼的頂部,以便下次我想重新編織一次較小的更改時不必再次運行它。那麼這應該允許我在load()命令的頂部重新運行新的單元格並編寫結果?是對的嗎?如果是這樣,我會盡量防止問題再次發生。謝謝 – TMWP
@ matt-tyers - 感謝您的幫助。有趣的症狀:.RDATA env文件加載變量中的內容,但不加載創建變量時啓動的文件,因此,如果在env中使用多個文件。你必須保留一個文件列表到env文件。在這個網站有問題。人們在評論中回答我的問題,但既不贊成也不發表他們的想法。因此,我的零比率正在攀升,我可能會失去提問的能力。你是否意識到,當你在評論中回答我的問題時,網站的工作方式是這樣的,而不會提高你的注意力? – TMWP