Создание дизайнерских документов CouchDB из R
Мне нужно создать дизайн-документы 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);
}
И обратно в РИ можно получить результаты просмотра:
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"))
1 ответ
Чтобы создать представление на CouchDB, вам нужно создать новый или обновить существующий проектный документ, а не просто поместить код функции. Я не знаю R, чтобы написать немного кода, но чтобы создать новый проектный документ с вашим представлением, вам нужно отправить следующий JSON вместо простого просмотра кода функции:
{
"_id": "_design/foodview",
"views": {
"foodview": {
"map": "function(doc) {emit(doc.day, doc.dinner);}"
}
}
}