0

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.frameのrjsonおよびパッケージのすべての toJSON コマンドを試しました。RJSONIO

library(rjson)
#library(RJSONIO)

DF2<-DF
colnames(DF2)<-NULL

cat(toJSON(DF))
cat(toJSON(DF2))

reshape2toJSON を使う前に の 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)
4

1 に答える 1

1

私はあなたの要求を完全には理解していません。おそらく私の解決策は役に立たないでしょうが、ここで試してみてください:

library(reshape2)
    prova <- dcast(DF, hie1 ~ ... )
     toJSON(prova, pretty = TRUE)
    [
      {
        "hie1": "Cl1",
        "Cl1op1": "/first.html",
        "Cl1op2": "/second.html"
      },
      {
        "hie1": "Cl2",
        "Clop1": "/third.html"
      }
    ] 

どこ:

> prova
  hie1      Cl1op1       Cl1op2       Clop1
1  Cl1 /first.html /second.html        <NA>
2  Cl2        <NA>         <NA> /third.html
于 2015-11-25T17:47:57.717 に答える