0

我是 R 新手,并且至少已经过了一天试图弄清楚这一点。

我一直在尝试从 data.table 创建 json,我想将其中一个变量的值用作键,并将其值作为组合其他变量的列表。我无法克服的障碍是使用变量的值作为键。

数据如下:

x<-data.table(ipUnit=c("192.168.2.254/1","192.168.2.5/1"), ip=c("192.168.2.254","192.168.2.5"), unit=c("1","1"))

            ipUnit            ip unit  
1: 192.168.2.254/1 192.168.2.254    1  
2:   192.168.2.5/1   192.168.2.5    1  

JSON I'd like to eventually have:  

IP_UNIT_ID" : [  
    "192.168.2.254/1" : {  
        "IP_ADDR" : "192.168.2.254",  
        "UNIT_ID" : "1 "  
    },  
    "192.168.2.5/1" : {  
        "IP_ADDR" : "192.168.2.5",  
        "UNIT_ID" : "1 "  
    }  
]  

我试过了:

e=parse(text="list(IP_UNIT_ID(list(ipUnit=list(\"IP_ADDR\"=ip,\"UNIT_ID\"=unit) )))")
toJSON(x[,eval(e)])

这使:

[{"IP_UNIT_ID":{"IP_ADDR":["192.168.2.254","192.168.2.5"],"UNIT_ID":["1","1"]}}] 

这显然不太正确。

最后一次尝试是使用 hash 包,因为它极大地简化了我想要的结构的创建,但是,它似乎不是 rjson 或 jsonlite 中支持的对象。我收到错误,例如:

Erreur:没有 S4 类的方法:哈希

4

1 回答 1

0

恕我直言,有时手动操作更容易 - 这意味着在这种情况下:使用以下方式构建 json sprintf

x<-data.frame(ipUnit=c("192.168.2.254/1","192.168.2.5/1"), ip=c("192.168.2.254","192.168.2.5"), unit=c("1","1"))
txt <- readLines(n = 10)
# "IP_UNIT_ID" : [
#     "192.168.2.254/1" : {
#         "IP_ADDR" : "192.168.2.254",
#         "UNIT_ID" : "1 "
#     },
#     "192.168.2.5/1" : {
#         "IP_ADDR" : "192.168.2.5",
#         "UNIT_ID" : "1 "
#     }
# ]
txt <- sub("# ", "", txt)
txt <- paste0(txt, collapse = "\n")
txt_ <- sprintf('"IP_UNIT_ID" : [\n%s\n]', paste0(with(x, sprintf('    "%s" : {\n        "IP_ADDR" : "%s",\n        "UNIT_ID" : "%s "\n    }', ipUnit, ip, unit, unit)), collapse = ",\n"))
identical(txt, txt_)
# [1] TRUE
于 2015-07-22T10:01:11.383 回答