2017-03-15 22 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'),但不幸的是,尚未支持「路徑」中的標準評估。