R: '无效的下标类型符号'

Posted

技术标签:

【中文标题】R: \'无效的下标类型符号\'【英文标题】:R: 'Invalid subscript type symbol'R: '无效的下标类型符号' 【发布时间】:2018-09-11 14:49:21 【问题描述】:

我目前正在研究2nd edition of Hadley's Advanced R book 中有关表达式和准引用的主题。在练习部分 20.6.5 中,任务是

“实现arrange_desc(),dplyr::arrange() 的变体,默认按降序排序。”

在玩耍时,我注意到一些令我困惑的事情。首先,我只是尝试编写一个函数,该函数将数据框和变量作为输入进行排序。我想自动引用变量以反映 dplyr::arrange() 的行为

arrange_desc2 <- function(.data, ...) 
   my_args <- enexprs(...)
   new_order <- order(.data[[my_args[[1]]]])
   return(list(my_args = my_args, new_order = new_order))


df <- data.frame(a = c(4, 3, 2, 1), 
                 b = c('d', 'c', 'b', 'a'))

arrange_desc2(df, a)

# $my_args
# $my_args[[1]]
# a

# $new_order
# [1] 4 3 2 1

这行得通,但坦率地说,我不明白为什么:毕竟,我在这里用一个符号进行子集化。深入挖掘,我注意到如果我这样写代码,我会得到一个错误:

arrange_desc3 <- function(.data, ...) 
   my_args <- enexprs(...)
   new_order <- order(.data[, my_args[[1]]])
   return(list(my_args = my_args, new_order = new_order))


arrange_desc3(df, a)
# Error in .subset(x, j) : invalid subscript type 'symbol'

为什么我可以使用符号对列表进行子集化(它与此处的表达式相同吗?)为什么符号显然是使用列表作为环境评估的,但仅在使用 [[ 时,而不是在使用 [ 时?换句话说,有什么区别:

a <- c(1, 1, 4, 3)
a[a]
# [1] 1 1 3 4
a[sym("a")] # but list(a = a)[[sym("a")]] will work!
# Error in a[sym("a")] : invalid subscript type 'symbol'

【问题讨论】:

【参考方案1】:

如果我们要转换为symbol,那么evaluate 它

a[eval(as.symbol("a"))]
#[1] 1 1 3 4

或与sym 相同,来自rlang

a[eval(rlang::sym("a"))]
#[1] 1 1 3 4

关于为什么更改的代码不起作用,order 应用于vector 或列,通过使用drop = FALSE,它是data.frame

【讨论】:

但是错误信息已经出现在数据框的子集化步骤。此外,我在参数中添加了 drop = TRUE,它与[ 结合将其转换为向量,就像[[ 一样,在任何一种情况下都只选择了一个列。而且我仍然不明白为什么用符号子集列表有效,但用符号子集向量无效。 对不起,我记得drop = TRUE是默认的,我相应地编辑了我的帖子,[[[之间的区别仍然存在。

以上是关于R: '无效的下标类型符号'的主要内容,如果未能解决你的问题,请参考以下文章

使用 4 循环的二维矩阵上的数组下标的无效类型“int [int]”

将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”

如何将多维下标存储为R中的变量

R语言ggplot2可视化为轴标签添加下标实战:符号下标百分比下标带括号的下标

R错误:“变量的类型无效(NULL)”

size_t 类型