我正在使用rmongodb和rmongodbHelper软件包,我已经构建了这个函数。
CUPS_CP_TAR36 <- function(codi,cant){
cups <- vector()
query <- json_to_bson('{"clLst.U_COD_POSTAL": codi, "clLst.TARIFA_ATR": {"$in": "3.0A","3.1A","6.1"]}}')
output <- json_to_bson('{"id":1}')
cursor <- mongo.find(mongo, sips, query, fields=output, limit=cant)
k = 0
while(mongo.cursor.next(cursor)){
k = k + 1
cups[k] <- mongo.bson.value(mongo.cursor.value(cursor), "_id")
}
return(cups)
}
但是当我尝试使用它时:
example <- CUPS_CP_TAR36(codi="08036", cant=10)
我收到以下错误,真的不知道为什么,我不习惯编写自己的函数:
Error in eval(expr, envir, enclos) : object 'codi' not found
谢谢!
答案 0 :(得分:1)
从github尝试最新的rmongodb版本。来自json的bson开箱即用。此外mongo.bson.to.list
适用于每种情况,因此您不需要从json构造bson。我计划下周将新版本的软件包推送到CRAN。
library(devtools)
install_github("mongosoup/rmongodb")
答案 1 :(得分:0)
query <- json_to_bson('{"clLst.U_COD_POSTAL": codi, ...}')
json_to_bson()
需要一个JSON字符串。您提供的字符串不是有效的JSON,因为{"key":val}
无效 - 而{"key":"val"}
或{"key":3.14}
有效。
当然,codi
甚至不打算成为你案件中的字符串,而是成为一个变量。但是当你编写代码时,R无法知道这一点。
所以你可以写:
query <- json_to_bson(sprintf('{"clLst.U_COD_POSTAL": "%s", ...}',codi))
然后是与codi值相等的表达式:
query <- json_to_bson('{"clLst.U_COD_POSTAL": "08036", ...}')
有一个涉及eval()
的错误消息的原因是b / c我写了JSON的解释非常非常简单 - 请注意这个&#34;包&#34;只是一种解决方法,很快就会多余。
使用字符串替换将JSON转换为list()
- 表达式,然后使用eval()
编辑。
rmongodbHelper / R / json_to_list.R:
json_to_list <- function(json) {
json <- gsub("\n","",json)
json <- gsub("\\{\\}","list()",json)
[...]
json <- gsub("\\$","_$",json)
return(eval(parse(text = json)))
}