2017-02-28 32 views
1

我從我的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.") 

``` 

回答

1

我想我可能會在這裏看到答案。我在2或3次編織嘗試中遇到了同樣的錯誤,而且每次都需要10分鐘以上才能找到錯誤點,但這不是您想要重複執行多次的過程。但是,在做出表面編輯(刪除評論)後,再次點擊編織按鈕會產生新的錯誤,與本文中顯示的內容不同。

這種降價文件將走好小時或更長時間通過點擊和完整的代碼重新運行的每一個細胞+時間來重新編織。即使每個單元格都是從先前的成功嘗試運行的(並且輸出仍然在降價文檔中可見),但現在我懷疑某些內容不再被正確緩存。解決方案可能是這樣做的:重新運行每個單元,然後重新嘗試RStudio編織按鈕。

如果有人知道別的像這種情況下的嘗試,請不要交。否則,我正在研究一個漫長的過程,在我追上其他一些工作之後,我會稍後啓動。

+0

通常情況下,如果我有非常長時間的操作,我能負擔得起做針織「外」(而不想與緩存混亂),我會得到的對象保存到一個文件.Rdata。然後,我將在代碼塊中調用load(「thingy.Rdata」)'。它有點膽小,但爲我節省了很多時間和頭痛。 –

+0

不知道這將如何幫助當前hic。如果我理解你的建議,它可以幫助未來。首先,我必須解決所有問題。然後,一旦我得到乾淨的產出,編織得很好,我應該把它保存下來。Rdata文件然後將該文件的load()添加到我的代碼的頂部,以便下次我想重新編織一次較小的更改時不必再次運行它。那麼這應該允許我在load()命令的頂部重新運行新的單元格並編寫結果?是對的嗎?如果是這樣,我會盡量防止問題再次發生。謝謝 – TMWP

+0

@ matt-tyers - 感謝您的幫助。有趣的症狀:.RDATA env文件加載變量中的內容,但不加載創建變量時啓動的文件,因此,如果在env中使用多個文件。你必須保留一個文件列表到env文件。在這個網站有問題。人們在評論中回答我的問題,但既不贊成也不發表他們的想法。因此,我的零比率正在攀升,我可能會失去提問的能力。你是否意識到,當你在評論中回答我的問題時,網站的工作方式是這樣的,而不會提高你的注意力? – TMWP