2013-06-25 34 views
3

我需要從R創建CouchDB設計文檔,以便其他人可以在不學習或切換到CouchDB的情況下使用我的代碼。從R創建CouchDB設計文檔

此鏈接對於學習如何使用R:http://digitheadslabnotebook.blogspot.com/2010/10/couchdb-and-r.html中的CouchDB非常有用。以下是我可以和填充數據庫:

library(RJSONIO) 
library(RCurl) 
httpPUT("http://127.0.0.1:5984/fooddb") # Creates the fooddb database 
# Add two documents 
fromJSON(getURL("http://127.0.0.1:5984/fooddb", customrequest='POST', httpheader=c('Content-Type'='application/json'), postfields=toJSON(list(day="Monday", dinner="Pasta")))) 
fromJSON(getURL("http://127.0.0.1:5984/fooddb", customrequest='POST', httpheader=c('Content-Type'='application/json'), postfields=toJSON(list(day="Tuesday", dinner="Soup")))) 

在CouchDB的Web的GUI蒲團,我手動創建這個觀點(這是一步我想來自R做的)。

function(doc) { 
    emit(doc.day, doc.dinner); 
} 

而且早在RI可以得到視圖結果:

view.results <- fromJSON(httpGET("http://127.0.0.1:5984/fooddb/_design/fooddoc/_view/foodview")) 
view.results.df <- do.call(rbind.data.frame, view.results$rows) 
colnames(view.results.df) <- c("key", "day", "dinner") 

若要從R中的觀點,我保存視圖文件,並試圖把它變成CouchDB的

writeLines(toJSON("function(doc) { 
      emit(doc.day, doc.dinner); 
      }"), 
      "foodview.json") 
fromJSON(getURL("http://127.0.0.1:5984/fooddb/_design/foodview", customrequest='PUT', httpheader=c('Content-Type'='application/json'), postfields="@foodview.json")) 

但這會導致(「bad_request」「invalid_json」)。

什麼可能是錯的?我懷疑最後一行或「writeLines」命令,但沒有找到讓他們工作的方法。

更新:基於Kxepals的良好答案,我創建了一個新的writeLines,創建一個可以使用curl進行分析的視圖。

writeLines("{ 
    \"_id\": \"_design/foodview\", 
    \"views\": { 
    \"foodview\": { 
     \"map\": \"function(doc) {emit(doc.day, doc.dinner);}\" 
    } 
    } 
    }" 
, "foodview.json") 

但是下面這行仍然會給出同樣的錯誤。現在我確定錯誤在這一行。

fromJSON(getURL("http://127.0.0.1:5984/fooddb/_design/foodview", customrequest='PUT', httpheader=c('Content-Type'='application/json'), postfields="@foodview.json")) 

回答

2

要創建視圖的CouchDB的需要創建新的或更新存在設計文件,不只是把功能代碼。我不知道R鍵的編寫一些代碼,但與您的視圖中創建新的設計文件,你需要發送下一個JSON,而不是僅僅瀏覽功能代碼:

{ 
    "_id": "_design/foodview", 
    "views": { 
    "foodview": { 
     "map": "function(doc) {emit(doc.day, doc.dinner);}" 
    } 
    } 
} 
+0

感謝。這解決了問題的第一部分。現在我只需要獲取R部分。 – Chris