Как легко получить доступ к скрытой среде в package2 из package1? - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь сгенерировать широту и долготу в R, используя пакет localgeo из function1 в моем собственном пакете, однако я не могу понять, как это сделать без явной загрузки пакета.

Как я могу включить функцию внутри пакета package1 для быстрого доступа к скрытым средам package2 и их объектам?

### fails
data <- data.frame(City = c("New York", "Miami", "Los Angeles"), 
State = c("NY", "FL", "CA")
data <- cbind(data, localgeo::geocode(data[["City"]], data[["State"]]))
Error in UseMethod("tbl_vars") : 
  no applicable method for 'tbl_vars' applied to an object of class "NULL"
### works
library(localgeo)

data <- data.frame(City = c("New York", "Miami", "Los Angeles"), 
State = c("NY", "FL", "CA")
data <- cbind(data, geocode(data[["City"]], data[["State"]]))

Полагаю, проблема в том, что функция localgeo :: geocode () выглядит как

function (city, state) 
{
    data.frame(city = as.character(city), state = as.character(state), 
        stringsAsFactors = FALSE) %>% left_join(.localgeo$geo_db, 
        by = c("city", "state")) %>% select(lon, lat)
}
<environment: namespace:localgeo>

и я не знаю, как сделать .localgeo доступным для моей функции.


Обновления: кажется, что использование Depends: localgeo в файле DESCRIPTION моегоПакет не только «загружает», но и «присоединяет» localgeo, поэтому я могу без проблем запустить localgeo::geocode().Конечно,

Если нет веских причин, вам следует всегда перечислять пакеты в разделе «Импорт не зависит».Это связано с тем, что хороший пакет является автономным и сводит к минимуму изменения в глобальной среде (включая путь поиска).Единственное исключение - если ваш пакет предназначен для использования в сочетании с другим пакетом.Например, аналоговый пакет построен поверх веганского.Это бесполезно без вегана, поэтому он имеет веганский в зависимости от импорта.Точно так же ggplot2 должен действительно зависеть от масштабов, а не импортировать его. Пространство имен

Возможно ли получить доступ к скрытым средам в package2 в моем package1 без "прикрепления" package2?


Кте, кто ищет MWE, задача: решить эту MWE

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Проблема в том, что localgeo глючит.Он загружает некоторые данные, когда он подключен, но используя его так, как вы это делаете, пакет никогда не подключается, поэтому данные никогда не загружаются.Вот почему ошибка исчезает, когда вы звоните library(localgeo): она присоединяется.

Исправление довольно простое.Функция .onAttach в https://github.com/hrbrmstr/localgeo/blob/master/R/zzz.R должна быть переименована в .onLoad.

Я бы посоветовал следовать совету @ Gregor и не беспокоиться о localgeo, но вы также можете отправитьпроблема для localgeo автора на https://github.com/hrbrmstr/localgeo/issues или даже патча с помощью "pull-запроса" на https://github.com/hrbrmstr/localgeo/pulls.

0 голосов
/ 22 апреля 2019

Если вы создаете пакет, который вызывает функции из других пакетов, вам нужно несколько вещей.

  1. В вашем каталоге пакетов должен быть подкаталог с именем "R".Ваши функции помещаются в файл в этом подкаталоге «R».
  2. Ваш код должен выполнять квалифицированные вызовы функций.Ваш ошибочный код на самом деле правильный: localgeo :: geocode ().
  3. Я предполагаю, что вам не хватает части в вашем файле DESCRIPTION в каталоге вашего пакета.Здесь вы указываете зависимости пакетов, которые должны быть загружены вместе с вашей, используя узел Imports :.Пакет, который я разработал, зависит от нескольких других пакетов.Ваш код не вызывает функцию library () явно.Вы просто говорите в файле ОПИСАНИЕ, что вам нужно.Когда вы загружаете или создаете свой собственный пакет, файл DESCRIPTION будет также включать другие пакеты, и ваши квалифицированные вызовы функций будут работать.

Вот пример узла из моего файла DESCRIPTION в качестве примера.

Imports: 
    stats,
    utils,
    ggplot2,
    plyr
...