Мне нужно создать дизайн-документы CouchDB из R, чтобы другие могли использовать мой код, не изучая и не переключаясь на CouchDB.
Эта ссылка была очень полезна для изучения того, как использовать CouchDB из R: 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 Futon я вручную создаю это представление (это шаг, который я хочу сделать из R).
function(doc) {
emit(doc.day, doc.dinner);
}
И вернувшись в R, я могу получить результаты просмотра:
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, я создал новые строки записи, которые создают представление, которое можно проанализировать с помощью 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"))