2017-03-15 68 views
1

我正在搞tidyjson(最新来自github,由Jeremy Stanley出版)。我想排序自动搜索并提取嵌套数组。以下示例提供了我想要的输出。将字符变量传递给函数R(Tidyjson)

'{"name": {"first": "bob", "last": "jones"}, "age": 32}' %>% 
enter_object("name") %>% 
gather_keys %>% 
append_values_string 

'{"name": {"first": "bob", "last": "jones"}, "age": 32}' %>% 
enter_object(name) %>% 
gather_keys %>% 
append_values_string 

这些都给出相同的输出:

# A tbl_json: 2 x 3 tibble with a "JSON" attribute 
`attr(., "JSON")` document.id key string 
      <chr>  <int> <chr> <chr> 
1    "bob"   1 first bob 
2   "jones"   1 last jones 

但是,如果我宣布前一个字符变量,并沿着它无法通过。

object_name <- "name" 
'{"name": {"first": "bob", "last": "jones"}, "age": 32}' %>% 
enter_object(list(name="name")) %>% 
gather_keys %>% 
append_values_string 

Error: Path components must be single names or character strings 

任何想法为什么会发生这种情况?

回答

0

如果您熟悉哈德利的书Advanced R,这是一块非标准评价,不幸的是目前并没有在纯tidyjson解决方法(我宁愿enter_object_使用标准的评估,更像dplyr)。我希望在某些时候可以使用该功能,因为正如您所建议的那样,将这些类型的程序进行矢量化和自动化将会很好。

非标准评估是允许您在第二个示例中(而不是寻找名为name的对象的程序)取消未引用的name并仍然获得良好结果的“魔术”。危险是它不能解决您的案例中的对象object_name

这就是说,它似乎可以工作,周围的do.call和(我定你的榜样,因为我觉得它去有点歪)

library(tidyjson) 

json <- "{\"name\": {\"first\": \"bob\", \"last\": \"jones\"}, \"age\": 32}" 
object_name <- "name" 

do.call(enter_object, args = list(json, object_name)) %>% gather_object %>% 
    append_values_string 
#> # A tbl_json: 2 x 3 tibble with a "JSON" attribute 
#> `attr(., "JSON")` document.id name string 
#>    <chr>  <int> <chr> <chr> 
#> 1   "\"bob\""   1 first bob 
#> 2  "\"jones\""   1 last jones 

我绝对推荐检查出的一些参数列表tidyjson开发版中的新特性/功能与devtools::install_github('jeremystan/tidyjson'),但不幸的是,尚未支持“路径”中的标准评估。