Добавить объекты в пространство имен пакета - PullRequest
34 голосов
/ 22 июня 2010

Я бы хотел поместить функцию в пространство имен пакета, чтобы он мог обращаться к внутренним объектам этого пакета (в качестве примера рассмотрим пакет stats).Я пытался использовать

myfun <- function(x) print(x)
env = loadNamespace("stats")
assign("myfun", myfun , env)

Но он заблокирован.Поэтому я попытался разблокировать свой объект

unlockBinding("myfun", env)

Поскольку myfun еще не существует, я не могу разблокировать его.

Любая помощь?

Ответы [ 3 ]

35 голосов
/ 04 августа 2010

По линии решения @ Hadley, но с использованием среды пространства имен, как насчет:

environment(myfun) <- asNamespace('stats')
19 голосов
/ 23 июня 2010

Почему бы просто не установить среду новой функции в нужном месте?

myfun <- function(x) print(x)
environment(myfun) <- as.environment("package:stats")
7 голосов
/ 22 июня 2010

Вы можете получить доступ к внутренним объектам пакета, используя оператор тройного двоеточия :::. Взгляните, например, на as.roman и utils:::.roman2numeric. (Сравните это с utils::.roman2numeric.) Это может помочь вам избежать помещения функции в пространство имен.

Возможно, вы захотите взглянуть на dont.lockBindings в пакете mvbutils, который останавливает блокировку пространств имен.

...