Подтвердить что ты не робот

Mutate() пытается извлечь, используя значение глобальной переменной при использовании оператора знака доллара

Я получаю смешные результаты, используя mutate с извлечением $, когда в глобальной среде с тем же именем, что и извлеченный элемент, появляется переменная. (Я запускаю R 3.1.3 и dplyr 0.4.3.9.) Это прекрасно работает:

library(dplyr)

df <- data.frame(time = 1:5, val = c(2.3, 3.9, NA, 8.1, 9.6))

mutate(df, val = approx(time, val, time)$y)
#   time val
# 1    1 2.3
# 2    2 3.9
# 3    3 6.0
# 4    4 8.1
# 5    5 9.6

Но если я определяю глобальную переменную y, происходят смешные вещи:

y <- 1L
mutate(df, val = approx(time, val, time)$y)
# Error: invalid subscript type 'integer'

Обратите внимание, что использование двойных скобок со строковым аргументом по-прежнему работает как ожидалось:

mutate(df, val = approx(time, val, time)[['y']])
#   time val
# 1    1 2.3
# 2    2 3.9
# 3    3 6.0
# 4    4 8.1
# 5    5 9.6

Интересно, что мы получаем другой тип ошибки, если y является символом:

y <- 'a'
mutate(df, val = approx(time, val, time)$y)
# Error: unsupported type for column 'val' (NILSXP, classes = NULL)

Наконец, для полноты здесь приведен пример, демонстрирующий, что это определенно не обычное поведение для извлечения списка:

l <- list(y = 1:4)
y <- 'a'
l$y
# [1] 1 2 3 4

Кто-нибудь знает, почему мы получаем это странное поведение внутри mutate? И есть ли простой способ исправить эту проблему, кроме использования двойных скобок для извлечения или обеспечения отсутствия конфликтующих переменных на пути поиска?

Кстати, похоже, что OP в следующем посте, возможно, имел ту же проблему, но не совсем понял: dplyr mutate не работает с указанным вектором?

4b9b3361

Ответ 1

Как заметил @clbieganek, это ошибка. Он еще не исправлен (по версии dplyr версии 4.3)

Возможное исправление, предложенное в комментариях:

$'y'

Это проблема, которая отслеживает эту общую проблему: https://github.com/hadley/dplyr/issues/1400