The dynamic nature of R limits the extent of these checks. But as Ryan has
noted, a simple sanity check goes a long way. If what he has done could be
extended to the rest of the search path (people always forget to attach
packages), I think we've hit the 80% with 20%. Got a 404 on that URL btw.

Michael


On Mon, Nov 4, 2013 at 11:05 AM, Gabriel Becker <gmbec...@ucdavis.edu>wrote:

> Hey guys,
>
> Here is code that I have written which resolves library names into a full
> list of symbols:
>
> https://github.com/duncantl/CodeDepends/blob/forCRAN_0.3.5/R/librarySymbols.RNote
> this does not require that the packages actually be loaded at the time
> of the check, and does not load them (or rather, it loads them but does not
> attach them, so no searchpath muddying occurs). You do need a list of
> packages to check though (it adds the base ones automatically). It handles
> dependency and could be easily extended to handle suggests as well I think.
>
> When CodeDepends gets pushed to cran (not my call and not high on my
> priority list to push for currently) it will actually do exactly what you
> want. (the forCRAN_0.3.5 branch already does and I believe it is
> documented, so you could use devtools to install it now).
>
> As a side note, I'm not sure that existence of a symbol is sufficient (it
> certainly is necessary). What about situations where the symbol exists but
> is stale compared to the value in the parent? Are we sure that can never
> happen?
>
> ~G
>
>
> On Mon, Nov 4, 2013 at 7:29 AM, Michel Lang <michell...@gmail.com> wrote:
>
> > You might want to consider using Recall() for recursion which should
> solve
> > this. Determining the required variables using heuristics as codetools
> will
> > probably lead to some confusion when using functions which include calls
> > to, e.g., with():
> >
> > f = function() {
> >   with(iris, Sepal.Length + Sepal.Width)
> > }
> > codetools:::findGlobals(f)
> >
> > I would suggest to write up some documentation on what the function's
> > environment contains and how to to define variables accordingly - or why
> it
> > can generally be considered a good idea to pass everything essential as
> an
> > argument. Nevertheless a "bpExport" function would be a good addition for
> > some rare corner cases in my opinion.
> >
> > Michel
> >
> >
> > 2013/11/3 Henrik Bengtsson <h...@biostat.ucsf.edu>
> >
> > > Hi,
> > >
> > > in BiocParallel, is there a suggested (or planned) best standards for
> > > making *locally* assigned variables (e.g. functions) available to the
> > > applied function when it runs in a separate R process (which will be
> > > the most common use case)?  I understand that avoid local variables
> > > should be avoided and it's preferred to put as mush as possible in
> > > packages, but that's not always possible or very convenient.
> > >
> > > EXAMPLE:
> > >
> > > library('BiocParallel')
> > > library('BatchJobs')
> > >
> > > # Here I pick a recursive functions to make the problem a bit harder,
> > i.e.
> > > # the function needs to call itself ("itself" = see below)
> > > fib <- function(n=0) {
> > >   if (n < 0) stop("Invalid 'n': ", n)
> > >   if (n == 0 || n == 1) return(1)
> > >   fib(n-2) + fib(n-1)
> > > }
> > >
> > > # Executing in the current R session
> > > cluster.functions <- makeClusterFunctionsInteractive()
> > > bpParams <- BatchJobsParam(cluster.functions=cluster.functions)
> > > register(bpParams)
> > > values <- bplapply(0:9, FUN=fib)
> > > ## SubmitJobs |++++++++++++++++++++++++++++++++++| 100% (00:00:00)
> > > ## Waiting [S:0 R:0 D:10 E:0] |+++++++++++++++++++| 100% (00:00:00)
> > >
> > >
> > > # Executing in a separate R process, where fib() is not defined
> > > # (not specific to BiocParallel)
> > > cluster.functions <- makeClusterFunctionsLocal()
> > > bpParams <- BatchJobsParam(cluster.functions=cluster.functions)
> > > register(bpParams)
> > > values <- bplapply(0:9, FUN=fib)
> > > ## SubmitJobs |++++++++++++++++++++++++++++++++++| 100% (00:00:00)
> > > ## Waiting [S:0 R:0 D:10 E:0] |+++++++++++++++++++| 100% (00:00:00)
> > > Error in LastError$store(results = results, is.error = !ok,
> throw.error =
> > > TRUE)
> > > :
> > >   Errors occurred during execution. First error message:
> > > Error in FUN(...): could not find function "fib"
> > > [...]
> > >
> > >
> > > # The following illustrates that the solution is not always
> > > straightforward.
> > > # (not specific to BiocParallel; must have been discussed previously)
> > > values <- bplapply(0:9, FUN=function(n, fib) {
> > >   fib(n)
> > > }, fib=fib)
> > > Error in LastError$store(results = results, is.error = !ok,
> > > throw.error = TRUE) :
> > >   Errors occurred during execution. First error message:
> > > Error in fib(n): could not find function "fib"
> > > [...]
> > >
> > > # Workaround; make fib() aware of itself
> > > # (this is something the user need to do, and would be very
> > > #  hard for BiocParallel et al. to automate.  BTW, should all
> > > #  recursive functions be implemented this way?).
> > > fib <- function(n=0) {
> > >   if (n < 0) stop("Invalid 'n': ", n)
> > >   if (n == 0 || n == 1) return(1)
> > >   fib <- sys.function() # Make function aware of itself
> > >   fib(n-2) + fib(n-1)
> > > }
> > > values <- bplapply(0:9, FUN=function(n, fib) {
> > >   fib(n)
> > > }, fib=fib)
> > >
> > >
> > > WISHLIST:
> > > Considering the above recursive issue solved, a slightly more explicit
> > > and standardized solution is then:
> > >
> > > values <- bplapply(0:9, FUN=function(n, BPGLOBALS=NULL) {
> > >   for (name in names(BPGLOBALS)) assign(name, BPGLOBALS[[name]])
> > >   fib(n)
> > > }, BPGLOBALS=list(fib=fib))
> > >
> > > Could the above be generalized into something as neat as:
> > >
> > > bpExport("fib")
> > > values <- bplapply(0:9, FUN=function(n) {
> > >   BiocParallel::bpImport("fib")
> > >   fib(n)
> > > })
> > >
> > > or ideally just (analogously to parallel::clusterExport()):
> > >
> > > bpExport("fib")
> > > values <- bplapply(0:9, FUN=fib)
> > >
> > > /Henrik
> > >
> > > _______________________________________________
> > > Bioc-devel@r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/bioc-devel
> > >
> >
> >         [[alternative HTML version deleted]]
> >
> > _______________________________________________
> > Bioc-devel@r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/bioc-devel
> >
>
>
>
> --
> Gabriel Becker
> Graduate Student
> Statistics Department
> University of California, Davis
>
>         [[alternative HTML version deleted]]
>
> _______________________________________________
> Bioc-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>

        [[alternative HTML version deleted]]

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to