こんにちは@Sim私は昨日、定義した問題に反映させていた:
flatten<-function(x) {
dumnames<-unlist(getnames(x,T))
dumnames<-gsub("(*.)\\.1","\\1",dumnames)
repeat {
x <- do.call(.Primitive("c"), x)
if(!any(vapply(x, is.list, logical(1)))){
names(x)<-dumnames
return(x)
}
}
}
getnames<-function(x,recursive){
nametree <- function(x, parent_name, depth) {
if (length(x) == 0)
return(character(0))
x_names <- names(x)
if (is.null(x_names)){
x_names <- seq_along(x)
x_names <- paste(parent_name, x_names, sep = "")
}else{
x_names[x_names==""] <- seq_along(x)[x_names==""]
x_names <- paste(parent_name, x_names, sep = "")
}
if (!is.list(x) || (!recursive && depth >= 1L))
return(x_names)
x_names <- paste(x_names, ".", sep = "")
lapply(seq_len(length(x)), function(i) nametree(x[[i]],
x_names[i], depth + 1L))
}
nametree(x, "", 0L)
}
(getnames
がAnnotationDbiから構成されている::: make.name.tree)
(
flatten
は
How to flatten a list to a list without coercion?ここでの議論から構成されています)簡単な例として
my_data<-list(x=list(1,list(1,2,y='e'),3))
> my_data[['x']][[2]][['y']]
[1] "e"
> out<-flatten(my_data)
> out
$x.1
[1] 1
$x.2.1
[1] 1
$x.2.2
[1] 2
$x.2.y
[1] "e"
$x.3
[1] 3
> out[['x.2.y']]
[1] "e"
ので、結果はあなたが示唆おおよそ命名構造を持つ扁平なリストです。強要も避けられますが、それはプラスです。
より複雑な例
library(RJSONIO)
library(RCurl)
json.data<-getURL("http://www.reddit.com/r/leagueoflegends/.json")
dumdata<-fromJSON(json.data)
out<-flatten(dumdata)
UPDATE jsonlite
パッケージは、具体的にはJSONとの間の変換をするように設計RJSONIO
のフォークである.1
my_data<-list(x=list(1,list(1,2,y='e'),3))
gsub("(*.)\\.1","\\1",unlist(getnames(my_data,T)))
> gsub("(*.)\\.1","\\1",unlist(getnames(my_data,T)))
[1] "x.1" "x.2.1" "x.2.2" "x.2.y" "x.3"
Huh?私にとって英語が多すぎる(とにかく)理解する。いくつかの(恐らく)遅いコードをいくつか再現可能な入力に提供して、あなたが望む出力を生成し、そこから行くことを提案してください。おそらく、私はJSONを知らないだけかもしれません。新しいRセッションにペースト可能なものを提供して、どこかのJSONデータをダウンロードして質問を示すことができますか? [素晴らしい再現可能な例を作る方法](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –