【问题标题】:Error in eval(expr, envir, enclos) when using rmongodbHelper使用 rmongodbHelper 时 eval(expr, envir, enclos) 出错
【发布时间】:2014-12-09 02:24:15
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: r mongodb rmongodb


    【解决方案1】:
    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 的解释 - 请注意,这个“包”只是一种解决方法,希望很快就会成为多余。

    使用字符串替换将 JSON 转换为 list()-表达式,然后使用 eval()ed。

    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

    【讨论】:

      【解决方案2】:

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

      library(devtools)
      install_github("mongosoup/rmongodb")
      

      【讨论】:

      • mongo.bson.from.JSON() 现在是否适用于所有情况(数组、子文档...)?
      • 是的!!!现在 rmongodb 将 json 数组转换为 unnamed 列表。此外,今天我将推送修复(或增强:-)),用于将简单数组(integer, numeric, logical, POSIX)转换为 R 数组而不是列表。请测试一下。
      • 酷!所以修复还允许将以下 JSON 转换为有效的 BSON? {"arr":["string",3.14,[1,"2",[3],{"four":4}],{"mol":42}]}?我会在 GitHub-repo 和我的网站上发布公告
      • 创建 bson 并将其插入 mongo 后,我在 mongo 中有这个对象:{ "_id" : ObjectId("543e6162563d081250d05777"), "arr" : [ "string", 3.14, [ 1, "2", [ 3 ], { "four" : 4 } ], { "mol" : 42 } ] }
      • 太棒了!感谢您抽出宝贵时间解决此问题!
      猜你喜欢
      • 2012-11-19
      • 1970-01-01
      • 2023-03-29
      • 2013-08-08
      • 2013-10-28
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多