我在 R 中有一个周期性的过程,它产生了一个 data.frame。我想用这个 data.frame 用 AngularJS 创建一个下拉选择器。
我的最终 data.frame 将或多或少如下所示(我的真实示例可能具有更深的层次结构):
DF<-data.frame(hie1=c(rep("Cl1",2),"Cl2"),hie2=c("Cl1op1","Cl1op2","Clop1"),
hie3=c("/first.html","/second.html","/third.html"))
我需要将该 data.frame 转换为具有以下结构的 JSON:
{
"Cl1":{"Cl1op1":"/first.html","Cl1op2": "/second.html"},
"Cl2":{"Cl2op1":"/third.html"}
}
到目前为止,我已经尝试了带有和不带有列名的 data.framerjson
和包的所有 toJSON 命令:RJSONIO
library(rjson)
#library(RJSONIO)
DF2<-DF
colnames(DF2)<-NULL
cat(toJSON(DF))
cat(toJSON(DF2))
在使用 toJSON 之前,我考虑过使用reshape2
的 dcast 函数,但我不知道我需要什么样的结构来实现我的目标。
我还使用了 rCharts 中的函数toJSON2
,toJSONArray
但没有成功。
R 中是否有适当的转换来获得我正在寻找的输出?
PS(我不介意用 [] 代替 {})
编辑:
我创建了几个函数(包括在下面)来满足我的需求。但是,它们并不太干净,我相信在 R 中必须有更好的方法来执行这种转换。
我保持这个问题开放,期待更好的解决方案。
linktwo<-function(V){
paste0(sapply(V,function(x) paste0("'",toString(x),"'")),collapse=":")
}
pastehier<-function(DF){
if(ncol(DF)==2){
return(paste0(apply(DF,1,linktwo),collapse=","))
}else{
u<-unique(DF[,1])
output=character()
for(i in u){
output<-append(output,paste0(paste0("'",i,"'"),":{",pastehier(DF[DF[,1]==i,-1]),
"}"))
}
return(paste0(output,collapse=","))
}
}
pastehier(DF)