构建一个具有/奇怪结构的列表(?)
Building a List w/ Weird Structure(?)
我在 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"
根据上面的 reprex,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
)
我在 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"
根据上面的 reprex,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
)