我需要从 R 创建 CouchDB 设计文档,以便其他人无需学习或切换到 CouchDB 即可使用我的代码。
此链接对于学习如何从 R 中使用 CouchDB 非常有用:http: //digitheadslabnotebook.blogspot.com/2010/10/couchdb-and-r.html。在它之后,我可以创建和填充数据库:
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 Futon 中,我手动创建了这个视图(这是我想从 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"))