R: "Недопустимый символ типа индекса"
В настоящее время я прорабатываю темы, касающиеся выражений и квази-цитат во втором издании книги Хадли "Продвинутый R.". В разделе упражнений 20.6.5 задача состоит в том, чтобы
"Реализовать range_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
, затем eval
использовать это
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