2015-08-31 25 views
0

我有一個很長的腳本在R用於網頁抓取。我正在使用rvest函數來刮擦和rodbc將我的數據寫入SQL服務器數據庫。如何創建一個函數在R中刪除和重新創建數據框?

我想讓我的代碼瀏覽站點的麪包屑並將結果寫入名爲scrapeRow的向量,然後我想將該向量寫入名爲scrapeDF的單行數據框,然後將該數據框寫入我的SQL服務器。最後,我想刪除數據框並重新創建一個空的版本,以便在下一個向量中寫入。我從不希望數據框一次包含多於一行。

根據有多少麪包屑,「寫入」步驟可能發生在腳本的多個點上。由於這個原因,我想定義一個函數來「清除」數據框,並在數據寫入數據庫之後對其進行重建。

我的代碼寫成這樣:

clearScrapeDF <- function(x) { 
    if(exists('scrapeDF')) {rm(x)} 
    x <- as.data.frame(matrix(nrow=1, ncol=13)); 
    names(x) = c(
    'cat1', 'cat2', 'cat3', 'cat4', 'cat5', 
    'Prod', 'Prod_Url', 'Prod_Name', 
    'Vendor', 'Vend_Prod', 'Price', 'UOM', 'MetaLoadDt')} 

功能內的各條線做的正是我想要當x被替換爲「scrapeDF」他們這樣做。然而,clearScrapeDF(scrapeDF)對現有的scrapeDF數據框沒有任何作用,如果不存在,它也不會創建一個。

我相信我對R中函數的工作方式有一個根本性的誤解。 請幫我理解如何以編程方式刪除數據框並在循環中重建它。我想在一個函數中調用它,因爲它將在我的代碼的許多獨立部分。謝謝。

+0

您正在查找:將'x'或'return(x)'添加到函數的最後一行。然後調用'output = clearScrapeDF(scrapeDF)'你函數的最後一行不會像你打算的那樣返回'x'。 – Vlo

+0

就是這樣!我不知道我需要在這種情況下返回x。謝謝你,謝謝你,謝謝你。 –

+0

函數的最後一行隱式返回。使用'return'可以使你的代碼更具可讀性,或者可以用它來結束函數並在所有代碼運行之前返回一個對象。例如,'代碼; (條件)返回(對象);更多代碼' – Vlo

回答

0

在R中,函數不會改變全局環境中的內容,除非您特別提問 - 超級分配運算符<<-或函數assign()。在慣用R中,函數不應該具有「副作用」 - 它們只是基於映射/函數返回值。你在問R做一個非R的任務。

此外,我不知道爲什麼你需要這個功能。似乎你可以在寫入你的數據庫之後分配scrapeDF新的值集。

相關問題