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 предположит, что ваша переменная с каналами будет входить в следующую функцию с первой доступной возможностью, и вы можете ее снова открыть или в случае, если она не сможет найти использование этой переменной с помощью {. } {. }.