Я получаю смешные результаты, используя 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 не работает с указанным вектором?