On 28/08/2018 9:17 AM, J C Nash wrote:
Indeed, it appears that globalVariables must be outside the function. However, 
I had quite a bit of
fiddle to get things to work without errors or warnings or notes. While I now 
have a package that
does not complain with R CMD check, I am far from satisfied that I can give a 
prescription. I had
to remove lines in the rootfinder like
    envroot$fn <- fn
that were used to set the function to be used inside my instrumented function, 
and instead
call TraceSetup(fn=fn, ...) where a similar statement was given. Why that 
worked while the direct
assignment (note, not a <<- one) did not, I do not understand. However, I will 
work with this for
a while and try to get a better handle on it.

Thanks for the pointer. As an old-time programmer from days when you even set 
the add table, I'm
still uncomfortable just putting code in a directory and assuming it will be 
executed, i.e., the
globals.R file. However, I now have this set to establish the global structure 
as follows

The code in the R directory in a package is all executed once when the package is installed, to produce the functions and other objects in the package. But that execution can do other things too, and that's what the call to globalVariables() does.

(The order of execution of the files in the R directory usually doesn't matter, but it is well defined: alphabetical order by filename in the C locale unless overridden by the Collate field in DESCRIPTION.)

Duncan Murdoch


## Put in R directory.
if(getRversion() >= "2.15.1") { utils::globalVariables(c('envroot')) } # Try 
declaring here
groot<-list(ifn=0, igr=0, ftrace=FALSE, fn=NA, gr=NA, label="none")
envroot <- list2env(groot) # Note globals in FnTrace

Then TraceSetup() is

TraceSetup <- function(ifn=0, igr=0, ftrace=FALSE, fn=NA, gr=NA){
    envroot$ifn <- ifn
    envroot$igr <- igr
    envroot$ftrace <- ftrace
    envroot$fn <- fn
    envroot$gr <- gr
    return()
}

and it is called at the start of the rootfinder routine.

Thus I am establishing a global, then (re-)setting values in TraceSetup(), then
incrementing counters etc. in the instrumented FnTrace() that is the function 
for which I find
the root, which calls fn() given by the "user". Messy, but I can now track 
progress and measure
effort.

I'm sure there are cleaner solutions. I suggest offline discussion would be 
better until such
options are clearer.

Thanks again.

JN



On 2018-08-28 12:01 AM, Fox, John wrote:
Hi John,

It's possible that I didn’t follow what you did, but it appears as if you call 
globalVariables() *inside* the function. Instead try to do as Richard Heiberger 
suggested and place the call outside of the function, e.g., in a source file in 
the package R directory named globals.R. (Of course, the name of the source 
file containing the command isn’t important.)

I hope this helps,
  John

-----------------------------------------------------------------
John Fox
Professor Emeritus
McMaster University
Hamilton, Ontario, Canada
Web: https://socialsciences.mcmaster.ca/jfox/



-----Original Message-----
From: R-package-devel [mailto:r-package-devel-boun...@r-project.org] On
Behalf Of J C Nash
Sent: Monday, August 27, 2018 8:44 PM
To: Richard M. Heiberger <r...@temple.edu>
Cc: List r-package-devel <r-package-devel@r-project.org>
Subject: Re: [R-pkg-devel] Trying to work around missing functionality

Unfortunately, makes things much worse. I'd tried something like this already.

* checking examples ... ERROR
Running examples in ‘rootoned-Ex.R’ failed The error most likely
occurred in:

### Name: rootwrap
### Title: zeroin: Find a single root of a function of one variable within
###   a specified interval.
### Aliases: rootwrap
### Keywords: root-finding

### ** Examples

# Dekker example
# require(rootoned)
dek <- function(x){ 1/(x-3) - 6 }
r1 <- rootwrap(dek, ri=c(3.0000001, 6), ftrace=TRUE,
method="uniroot")
Error in registerNames(names, package, ".__global__", add) :
   The namespace for package "rootoned" is locked; no changes in the global
variables list may be made.
Calls: rootwrap -> TraceSetup -> <Anonymous> -> registerNames
Execution halted

Also had to use utils::globalVariables( ...

JN


On 2018-08-27 08:40 PM, Richard M. Heiberger wrote:
Does this solve the problem?

if (getRversion() >= '2.15.1')
   globalVariables(c('envroot'))

I keep this in file R/globals.R

I learned of this from John Fox's use in Rcmdr.

On Mon, Aug 27, 2018 at 8:28 PM, J C Nash <profjcn...@gmail.com>
wrote:
In order to track progress of a variety of rootfinding or
optimization routines that don't report some information I want, I'm
using the following setup (this one for rootfinding).

TraceSetup <- function(ifn=0, igr=0, ftrace=FALSE, fn=NA, gr=NA){ #
JN: Define globals here
    groot<-list(ifn=ifn, igr=igr, ftrace=ftrace, fn=fn, gr=gr, label="none")
    envroot <<- list2env(groot) # Note globals in FnTrace
    ## This generates a NOTE that
    ## TraceSetup: no visible binding for '<<-' assignment to ‘envroot’
##   envroot<-list2env(groot, parent=.GlobalEnv) # Note globals in FnTrace -
- this does NOT work
    ## utils::globalVariables("envroot") # Try declaring here --
causes errors # end globals
    envroot
}

FnTrace <- function(x,...) {
   # Substitute function to call when rootfinding
   # Evaluate fn(x, ...)
     val <- envroot$fn(x, ...)
     envroot$ifn <- envroot$ifn + 1 # probably more efficient ways
     if (envroot$ftrace) {
        cat("f(",x,")=",val," after ",envroot$ifn," ",envroot$label,"\n")
     }
     val
}


Perhaps there are better ways to do this, but this does seem to work quite
well.
It lets me call a rootfinder with FnTrace and get information on evaluations
of fn().
(There's another gr() routine, suppressed here.)

However, R CMD check gives a NOTE for

   TraceSetup: no visible binding for global variable ‘envroot’
   Undefined global functions or variables:
     envroot

The commented lines in TraceSetup suggest some of the things I've
tried. Clearly I don't fully comprehend how R is grinding up the
code, but searches on the net seem to indicate I am far from alone. Does
anyone have any suggestion of a clean way to avoid the NOTE?

JN

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel


______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to