Add objects to package namespace

12,003

Solution 1

Along the line of @Hadley's solution, but using the environment of the namespace, how about:

environment(myfun) <- asNamespace('stats')

Solution 2

Why not just set the environment of your new function to the right place?

myfun <- function(x) print(x)
environment(myfun) <- as.environment("package:stats")

Solution 3

You can access internal objects of a package using the triple colon operator :::. Take a look at, for example, as.roman and utils:::.roman2numeric. (Compare this to utils::.roman2numeric.) This could help you avoid having to put your function inside the namespace.

You might also want to look at dont.lockBindings in the mvbutils package, which stops namespaces being locked.

Share:
12,003
Etienne Racine
Author by

Etienne Racine

Updated on July 31, 2022

Comments

  • Etienne Racine
    Etienne Racine almost 2 years

    I'd like to push a function inside a package namespace so it can access internal objects of that package (let's use stats package as an example). I've tried using

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

    But it is locked. So I've tried to unlock my object

    unlockBinding("myfun", env)
    

    Since myfun doesn't exist yet, I can't unlock it.

    Any help ?

  • Etienne Racine
    Etienne Racine about 14 years
    If I understand correctly, I cannot unlock a package's Namespace once it is locked (except by reloading it with dont.lockBindings). So it's impossible to add a new function a posteriori.
  • Richie Cotton
    Richie Cotton about 14 years
    @Etiennebr: AFAIK you are correct. Once the namespace is locked, you can't add to it. I still think that ::: is the way to proceed.
  • Etienne Racine
    Etienne Racine about 14 years
    I didn't know that ! But I think I would like it to be namespace:stats instead of package:stats. Is there way to do that (just changing it in as.environment() doesn't work).
  • wch
    wch almost 12 years
    I'm late to the party, but this may be useful for others: The namespace actually is an environment. namespace:stats is a descendent the global environment and contains all the objects. The exported objects get copied over to package:stats, which is an ancestor of the global environment.
  • Tomas
    Tomas over 4 years
    in case that you need to modify an existing package function, which is to be called by other package functions, here is the solution