Reputation: 1383
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 ?
Upvotes: 41
Views: 14041
Reputation: 546
Along the line of @Hadley's solution, but using the environment of the namespace, how about:
environment(myfun) <- asNamespace('stats')
Upvotes: 44
Reputation: 103948
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")
Upvotes: 23
Reputation: 121167
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.
Upvotes: 7