R 一切平等:可以';由于类型不兼容(列表/列表),无法加入

R 一切平等:可以';由于类型不兼容(列表/列表),无法加入,r,dataframe,jsonlite,R,Dataframe,Jsonlite,我有一个data.frame,由JSON格式创建。它包含简单类型的数组,默认情况下表示为单个向量的列表。然后在单元测试中,我尝试用dplyr::all_equal检查它(我现在不关心列顺序,它们被jsonlite::flatte重新排序,我不知道如何处理) 但是all_equal失败,并显示一条不太有用的消息无法加入'arr'x'arr',因为不兼容的类型(列表/列表)。我不知道出了什么问题,list根本不能接受吗?我是否应该将此列转换为其他内容?(什么?) 显示我正在尝试做什么的最小示例: f

我有一个data.frame,由JSON格式创建。它包含简单类型的数组,默认情况下表示为单个向量的列表。然后在单元测试中,我尝试用
dplyr::all_equal
检查它(我现在不关心列顺序,它们被
jsonlite::flatte
重新排序,我不知道如何处理)

但是
all_equal
失败,并显示一条不太有用的消息
无法加入'arr'x'arr',因为不兼容的类型(列表/列表)
。我不知道出了什么问题,
list
根本不能接受吗?我是否应该将此列转换为其他内容?(什么?)

显示我正在尝试做什么的最小示例:

f <- function() {
    current <- jsonlite::fromJSON('{"objs":[{"arr":["l1", "l2"], "key":"1"}]}')$objs
    expected <- data.frame("key" = "1", stringsAsFactors = F) %>%
        mutate("arr" = list(c("l1", "l2")))

    str(current)
    str(expected)

    all_equal(current, expected, ignore_col_order = TRUE)
}

f()

注意:我看到了,但我认为我没有这个问题,因为数据帧没有分组。无论如何,我都试图将它们解组,但输出没有变化。

我也很乐意找到一种方法,可以在不改变列顺序的情况下展平嵌套的数据帧(这将使我使用
all.equal
而不是
all\u equal
),但这似乎超出了这个问题的范围。使用
all.equal
我得到
TRUE
,但使用
all\u equal
时会得到错误。你是在追求
all.equal
还是
all_equal
?@onyanbu我想
all_equal
忽略列的顺序,因为
jsonlite::flatte
会对列进行重新排序。我将编辑问题以更好地反映这一点(在这种情况下,
all.equal
将返回
FALSE
),似乎
all_equal()
无法处理包含嵌套元素的数据帧。如果您先取消nest,它会工作
list(current,expected)%%>%map(unnest,arr)%%>{all_equal([1]],[2]])}
。我也很乐意找到一种方法,可以在不改变列顺序的情况下展平嵌套的数据帧(这将使我使用
all.equal
而不是
all_equal
),但这似乎超出了这个问题的范围。使用
all.equal
我得到
TRUE
,但使用
all\u equal
时会得到错误。你是在追求
all.equal
还是
all_equal
?@onyanbu我想
all_equal
忽略列的顺序,因为
jsonlite::flatte
会对列进行重新排序。我将编辑问题以更好地反映这一点(在这种情况下,
all.equal
将返回
FALSE
),似乎
all_equal()
无法处理包含嵌套元素的数据帧。如果您先取消测试,它将工作
list(当前,预期)%%>%map(取消测试,arr)%%>%{all_equal([1]],[2]])}
'data.frame':   1 obs. of  2 variables:
 $ key: chr "1"
 $ arr:List of 1
  ..$ : chr  "l1" "l2"
'data.frame':   1 obs. of  2 variables:
 $ key: chr "1"
 $ arr:List of 1
  ..$ : chr  "l1" "l2"
 Error: Can't join on 'arr' x 'arr' because of incompatible types (list / list)