使用rmongodbHelper时,eval(expr,envir,enclos)出错

时间:2014-10-14 10:18:19

标签: r mongodb rmongodb

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

谢谢!

2 个答案:

答案 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)))
}

更多详情:MongoDB – State of the R