1

我正在使用 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

谢谢!

4

2 回答 2

1

从github尝试最新的 rmongodb 版本。来自 json 的 bson 开箱即用。此外mongo.bson.to.list,在每种情况下都可以正常工作,因此您不需要从 json 构造 bson。我计划下周将新版本的软件包推送到 CRAN。

library(devtools)
install_github("mongosoup/rmongodb")
于 2014-10-15T10:02:45.807 回答
0
query <- json_to_bson('{"clLst.U_COD_POSTAL": codi, ...}')

json_to_bson()需要一个 JSON 字符串。您提供的字符串不是有效的 JSON,就像{"key":val}无效一样 - while{"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 的解释 - 请注意,这个“包”只是一种解决方法,希望很快就会变得多余。

使用字符串替换将 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)))
}

更多细节:MongoDB – R 状态

于 2014-10-15T08:09:12.793 回答