tags:

views:

74

answers:

1

I would like to create a function within a package with a NAMESPACE that will save some variables. The problem is that when load is called on the .Rdata file it tries to load the namespace of the package that contained the function that created the .Rdata file, but this package need not be loaded.

This example function is in a package in a namespace :

create.global.function <- function(x, FUN, ...) {
 environment(FUN) <- .GlobalEnv
 assign(".GLOBAL.FUN", function(x) { FUN(x, ...) }, env=.GlobalEnv)
 environment(.GLOBAL.FUN) <- .GlobalEnv
 save(list = ls(envir = .GlobalEnv, all.names = TRUE),
      file = "/tmp/.Rdata",
      envir = .GlobalEnv)
}

The environment(.GLOBAL.FUN) <- .GlobalEnv calls are not sufficient and attaching gdb to the R process confirms it is serializing a NAMESPACESXP here with the name of the package namespace and the load fails because it is unable to load this.

Is it possible to fully strip the namespace out of the .GLOBAL.FUN before I save it such that it can be loaded into other R instances without trying to load the namespace?

A: 

@JorisMeys snowfall and the others do not offer exactly this functionality.

snowfall uses sfExport ( from clusterFunctions.R in snowfall) to export local and global objects to the slave nodes, and this in turn uses sfClusterCall which is a wrapper around the clusterCall function from snow.

res <- sfClusterCall( assign, name, val, env = globalenv(),
                      stopOnError = FALSE )

And the snow library is loaded on the clients getting around any namespace issues as I mentioned in the last sentence of my question I would like to not load the namespace there.

Furthermore, it seems to make simplified assumptions such as that the nodes will share an NFS mount point for shared data (e.g. sfSource function in clusterFunctions.R).

I am more interested in something like a case where a node saves an .Rdata file then scp's it to another node that need not have the package namespace loaded.

It seems I can for now solve my original problem by using eval.parent and substitute:

 assign(".GLOBAL.FUN",
         eval.parent(substitute(function(y) { FUN(y, ...) })),
         env=.GlobalEnv)

I apologize for the posting snafu, but I do not have an edit link although I posted this question, nor is there any place for me to leave a "comment" in the same way that I have this big text field for an answer. I've flagged this for moderation so I can get some help with that and have referenced the FAQ which talks about buttons that do not appear for me for leaving comments. there is some problem with this new account.

MurrayS