我在R中构建列表以匹配已解码JSON对象的结构时遇到问题。
考虑以下列表tbl
,使用jsonlite::fromJSON()
构造如下
tbl <- jsonlite::fromJSON('{"toplevel": [{"midlevel": {"id":"1",
"country":"US"
}},{"midlevel": {"id":"2",
"country":"US"
}},{"midlevel": {"id":"3",
"country":"GB"
}},{"midlevel": {"id":"5",
"country":"FR"
}}]}')
tbl
#> $toplevel
#> midlevel.id midlevel.country
#> 1 1 US
#> 2 2 US
#> 3 3 GB
#> 4 5 FR
str(tbl)
#> List of 1
#> $ toplevel:'data.frame': 4 obs. of 1 variable:
#> ..$ midlevel:'data.frame': 4 obs. of 2 variables:
#> .. ..$ id : chr [1:4] "1" "2" "3" "5"
#> .. ..$ country: chr [1:4] "US" "US" "GB" "FR"
您可以看到tbl$toplevel
是具有4行1列的数据帧,但是tbl$toplevel$midlevel
也具有4行。
我需要能够构建具有相同结构的列表,以便在使用jsonlite::toJSON()
时其编码相同,但是我遇到了一些问题。
tbl_attempt <-
list(
toplevel = data.frame(
midlevel = data.frame(
id = c(1, 2, 3, 5),
country = c("US", "US", "GB", "FR"), stringsAsFactors = FALSE
), stringsAsFactors = FALSE
)
)
tbl_attempt
#> $toplevel
#> midlevel.id midlevel.country
#> 1 1 US
#> 2 2 US
#> 3 3 GB
#> 4 5 FR
str(tbl_attempt)
#> List of 1
#> $ toplevel:'data.frame': 4 obs. of 2 variables:
#> ..$ midlevel.id : num [1:4] 1 2 3 5
#> ..$ midlevel.country: chr [1:4] "US" "US" "GB" "FR"
根据以上说明,tbl_attempt
在控制台上打印的内容与tbl
完全相同,但结构不同。有什么想法可以复制tbl
的结构吗?
我已经考虑过使用dput()
,但这感觉有点不客气,所以宁愿避免。
您可以分两步完成:
tbl2 <- list(
toplevel = data.frame(
midlevel = seq_len(4)
)
)
tbl2$toplevel$midlevel <- data.frame(
id = c("1", "2", "3", "5"),
country = c("US", "US", "GB", "FR"),
stringsAsFactors = FALSE
)