dplyr. и _no видимое связывание для глобальной переменной '.'_ Примечание в проверке пакета
В dplyr
можно написать код, например, используя "." ссылаться на данные в трубе
x <- data.frame(x = 2:4)
y <- data.frame(y = 1:3)
y %>% dplyr::bind_cols(x,.)
но при использовании его в функции и запуске проверки пакета он производит
нет видимой привязки для глобальной переменной '.'.
Как лучше всего обращаться с ПРИМЕЧАНИЕ?
Ответы
Ответ 1
Лучшая практика теперь состоит в том, чтобы, вероятно, использовать quosures. Эта другая публикация SO имеет хорошее резюме: как оценить построенную строку с нестандартной оценкой с помощью dplyr?
На практике я только что включил . = NULL
. = NULL
в верхней части моих функций.
РЕДАКТИРОВАТЬ
Как отметил @MrFlick, в этом случае quosures фактически не помогут. Вы можете реально использовать quosures для определения имен столбцов и т.д. Таким образом, чтобы вы могли избежать заметок о нестандартной оценке в функциях пакета (я еще этого не делал, но в моем списке дел по крайней мере один из моих пакетов), но вы не можете на самом деле использовать эту стратегию для привязки значений к указанному аргументу или позиции .
,
Стоит отметить, что есть, по крайней мере, некоторые накладные расходы с использованием труб. Возможно, наилучшей практикой является не использование труб вообще в ваших функциях пакета, что связано с проблемой использования .
, Для остальных NSE с командами dplyr
вы можете использовать quosures.
Ответ 2
Кажется, что лучшей практикой является использование .data
вместо .
а затем используйте import .data
из пакета rlang
. Из программирования с dplyr
:
Если эта функция находится в пакете, использование.data также предотвращает проверку R CMD с помощью уведомления о неопределенных глобальных переменных (при условии, что вы также импортировали данные rlang ::. С данными @importFrom rlang.data).
К сожалению, это не работает для исходного вопроса с dplyr::bind_cols
, но он работает, например, в dplyr::mutate
и dplyr::do
.
Ответ 3
Код, который вы опубликовали, работает для меня:
> x <- data.frame(x = 2:4)
> y <- data.frame(y = 1:3)
> y %>% dplyr::bind_cols(x, .)
x y
1 2 1
2 3 2
3 4 3
Сказав это, вот две альтернативы, которые производят похожие, но разные результаты:
> y %>% dplyr::bind_cols(x)
y x
1 1 2
2 2 3
3 3 4
Здесь R видит y
как предыдущий аргумент x
поскольку dplyr::bind_cols
ожидает в качестве своих первых аргументов сколько-нибудь число кадров данных, поэтому, видя, что вы соединяете его один и считаете, что он должен быть первым.
> y %>% dplyr::bind_cols(x, { . })
y x y1
1 1 2 1
2 2 3 2
3 3 4 3
Вы можете также ссылаться на переменную с каналами как {. }
{. }
в том случае, если .
не работает. Однако вы можете видеть здесь, что magrittr все еще дал y
в качестве первого аргумента и дал его снова, где я указал {. }
{. }
.
Поэтому я думаю, что magrittr предположит, что ваша переменная с каналами будет входить в следующую функцию с первой доступной возможностью, и вы можете ее снова открыть или в случае, если она не сможет найти использование этой переменной с помощью {. }
{. }
.