On 13/07/2015 9:42 PM, John Fox wrote: > Dear Duncan, > > On Mon, 13 Jul 2015 20:00:02 -0400 > Duncan Murdoch <murdoch.dun...@gmail.com> wrote: >> On 13/07/2015 7:35 PM, John Fox wrote: >>> Dear Duncan, >>> >>>> -----Original Message----- >>>> From: Duncan Murdoch [mailto:murdoch.dun...@gmail.com] >>>> Sent: July-13-15 7:01 PM >>>> To: John Fox; 'peter dalgaard' >>>> Cc: r-package-devel@r-project.org >>>> Subject: Re: [R-pkg-devel] "invalid 'envir' argument" note from R-devel >>>> >>>> It happened in r68597. In my example, I hadn't imported the data() >>>> function from utils; when I did that, it was fixed. >>>> >>>> Not sure why the error is complaining about the envir argument. >>> >>> >>> Yes, importing data works for me too! It's odd that the problem didn't show >>> up as an undefined global symbol rather than as a note about the envir >>> argument. (I was fixing imports from standard packages when the problem >>> arose.) >> >> I'd guess that it's finding some other private function called data(); >> that's probably worth fixing. > > If you mean an unexported function named data() in the Rcmdr package, then > I'm pretty sure that there is none -- and I just checked all of the many uses > of the word "data" in the Rcmdr sources. Of course, I may have missed > something or, more likely, misunderstood what you're suggesting.
I tracked it down to a bug in codetools. The "envir" it is talking about is an argument to a different function, nothing to do with the argument to data(). I've passed it on to Luke Tierney, author of codetools. Duncan Murdoch > Best, > John > >> >> Duncan >> >>> >>> Thanks for tracking this down. >>> >>> John >>> >>>> >>>> Duncan Murdoch >>>> >>>> On 13/07/2015 6:47 PM, John Fox wrote: >>>>> Dear Duncan and Peter, >>>>> >>>>> I've just arrived at more or less the same thing: >>>>> >>>>> foo <- function() data(package="MASS") >>>>> >>>>> bar <- function() data(package="MASS", envir=.GlobalEnv) >>>>> >>>>> baz <- function() data(package="MASS", envir=globalenv()) >>>>> >>>>> all trigger the note when included with the Rcmdr sources: >>>>> >>>>> * checking R code for possible problems ... NOTE >>>>> bar: Error while checking: invalid 'envir' argument >>>>> baz: Error while checking: invalid 'envir' argument >>>>> foo: Error while checking: invalid 'envir' argument >>>>> >>>>> The envir argument to data() defaults to .GlobaEnv . >>>>> >>>>> I hope this helps, >>>>> John >>>>> >>>>>> -----Original Message----- >>>>>> From: Duncan Murdoch [mailto:murdoch.dun...@gmail.com] >>>>>> Sent: July-13-15 6:32 PM >>>>>> To: John Fox; 'peter dalgaard' >>>>>> Cc: r-package-devel@r-project.org >>>>>> Subject: Re: [R-pkg-devel] "invalid 'envir' argument" note from R- >>>> devel >>>>>> >>>>>> On 13/07/2015 5:23 PM, John Fox wrote: >>>>>>> Dear Peter, >>>>>>> >>>>>>>> -----Original Message----- >>>>>>>> From: peter dalgaard [mailto:pda...@gmail.com] >>>>>>>> Sent: July-13-15 4:52 PM >>>>>>>> To: John Fox >>>>>>>> Cc: r-package-devel@r-project.org >>>>>>>> Subject: Re: [R-pkg-devel] "invalid 'envir' argument" note from R- >>>>>> devel >>>>>>>> >>>>>>>> Yes, there was a similar note from Alexandra Kuznetsova a couple of >>>>>> days >>>>>>> >>>>>>> Sorry, I didn't notice that. >>>>>>> >>>>>>>> ago. Look unintentional, but it is not easy to spot what triggers >>>> it. >>>>>> If >>>>>>>> someone could cook up a minimal example, or - maybe easier given >>>> the >>>>>>>> relatively short timeframe - bisect their way to the exact svn >>>>>> revision >>>>>>>> that triggered it, it might help in getting it fixed. >>>>>>> >>>>>>> I'm afraid that I'm not set up to build R-devel and I'm about to >>>> leave >>>>>> town >>>>>>> for three weeks. I'll see if I can produce a simpler example >>>>>> triggering the >>>>>>> error, however. >>>>>> >>>>>> Hana Sevcikova posted a simple example. I'll bisect on it. >>>>>> >>>>>> Here's her example: >>>>>> >>>>>> e <- new.env() >>>>>> data("mydataset", envir=e) >>>>>> >>>>>> I've substituted USArrests for "mydataset". >>>>>> >>>>>> Duncan Murdoch >>>>>> >>>>>>> >>>>>>> Thanks for this, >>>>>>> John >>>>>>> >>>>>>>> >>>>>>>> -pd >>>>>>>> >>>>>>>>> On 13 Jul 2015, at 22:31 , John Fox <j...@mcmaster.ca> wrote: >>>>>>>>> >>>>>>>>> Dear list members, >>>>>>>>> >>>>>>>>> I'm getting a new note from R-devel that I haven't seen before >>>> when >>>>>>>> checking >>>>>>>>> the development version of the Rcmdr package: >>>>>>>>> >>>>>>>>> * checking R code for possible problems ... NOTE >>>>>>>>> readDataFromPackage: Error while checking: invalid 'envir' >>>> argument >>>>>>>>> >>>>>>>>> This note doesn't appear in R 3.2.1. >>>>>>>>> >>>>>>>>> My session info: >>>>>>>>> >>>>>>>>> -------- snip ---------- >>>>>>>>> >>>>>>>>> R Under development (unstable) (2015-07-12 r68650) >>>>>>>>> Platform: x86_64-w64-mingw32/x64 (64-bit) >>>>>>>>> Running under: Windows 7 x64 (build 7601) Service Pack 1 >>>>>>>>> >>>>>>>>> locale: >>>>>>>>> [1] LC_COLLATE=English_Canada.1252 LC_CTYPE=English_Canada.1252 >>>>>>>>> LC_MONETARY=English_Canada.1252 >>>>>>>>> [4] LC_NUMERIC=C LC_TIME=English_Canada.1252 >>>>>>>>> >>>>>>>>> attached base packages: >>>>>>>>> [1] stats graphics grDevices utils datasets methods >>>> base >>>>>>>>> >>>>>>>>> loaded via a namespace (and not attached): >>>>>>>>> [1] tools_3.3.0 >>>>>>>>> >>>>>>>>> -------- snip ---------- >>>>>>>>> >>>>>>>>> I can't even localize the problem in readDataFromPackage(). There >>>>>> are >>>>>>>> only >>>>>>>>> two places in this function where there's a function call with an >>>>>>>> envir >>>>>>>>> argument, and I still get the note if I comment these out. As >>>> well, >>>>>>>>> readDataFromPackage() seems to work as intended -- there is no >>>>>> obvious >>>>>>>> error >>>>>>>>> in it. >>>>>>>>> >>>>>>>>> FWIW, here's readDataFromPackage(). The complete sources for the >>>>>>>> development >>>>>>>>> version of the Rcmdr package are on R-Forge. >>>>>>>>> >>>>>>>>> -------- snip ---------- >>>>>>>>> >>>>>>>>> readDataFromPackage <- function() { >>>>>>>>> env <- environment() >>>>>>>>> datasets <- NULL >>>>>>>>> initializeDialog(title=gettextRcmdr("Read Data From >>>> Package")) >>>>>>>>> dsname <- tclVar("") >>>>>>>>> package <- NULL >>>>>>>>> enterFrame <- tkframe(top) >>>>>>>>> entryDsname <- ttkentry(enterFrame, width="20", >>>>>>>> textvariable=dsname) >>>>>>>>> packages <- sort(.packages()) >>>>>>>>> packages <- packages[! packages %in% c("base", "stats")] >>>>>>>>> packages <- packages[sapply(packages, function(package){ >>>>>>>>> ds <- >>>>>>>>> data(package=package)$results >>>>>>>>> if (nrow(ds) == 0) >>>>>>>>> return(FALSE) >>>>>>>>> ds <- ds[, "Item"] >>>>>>>>> valid <- sapply(ds, >>>>>>>>> is.valid.name) >>>>>>>>> length(ds[valid]) > >>> 0 >>>>>>>>> })] >>>>>>>>> packageDatasetFrame <- tkframe(top) >>>>>>>>> packageFrame <- tkframe(packageDatasetFrame) >>>>>>>>> max.height <- getRcmdr("variable.list.height") >>>>>>>>> packageBox <- tklistbox(packageFrame, height=min(max.height, >>>>>>>>> length(packages)), >>>>>>>>> exportselection="FALSE", >>>>>>>>> selectmode="single", background="white") >>>>>>>>> packageScroll <- ttkscrollbar(packageFrame, >>>>>>>>> command=function(...) tkyview(packageBox, >>> ...)) >>>>>>>>> tkconfigure(packageBox, yscrollcommand=function(...) >>>>>>>>> tkset(packageScroll, ...)) >>>>>>>>> for (p in packages) tkinsert(packageBox, "end", p) >>>>>>>>> datasetFrame <- tkframe(packageDatasetFrame) >>>>>>>>> datasetBox <- tklistbox(datasetFrame, height=max.height, >>>>>>>>> exportselection="FALSE", >>>>>>>>> selectmode="single", background="white") >>>>>>>>> datasetScroll <- ttkscrollbar(datasetFrame, >>>>>>>>> command=function(...) tkyview(datasetBox, >>> ...)) >>>>>>>>> tkconfigure(datasetBox, yscrollcommand=function(...) >>>>>>>>> tkset(datasetScroll, ...)) >>>>>>>>> onPackageSelect <- function(){ >>>>>>>>> assign("package", >>>>>>>>> packages[as.numeric(tkcurselection(packageBox)) + 1], envir=env) >>>>>>>>> datasets <<- data(package=package)$results[,3] >>>>>>>>> valid <- sapply(datasets, is.valid.name) >>>>>>>>> datasets <<- datasets[valid] >>>>>>>>> tkdelete(datasetBox, "0", "end") >>>>>>>>> for (dataset in datasets) tkinsert(datasetBox, >>> "end", >>>>>>>>> dataset) >>>>>>>>> tkconfigure(datasetBox, height=min(max.height, >>>>>>>>> length(datasets))) >>>>>>>>> firstChar <- tolower(substr(datasets, 1, 1)) >>>>>>>>> len <- length(datasets) >>>>>>>>> onLetter <- function(letter){ >>>>>>>>> letter <- tolower(letter) >>>>>>>>> current <- 1 + >>>>>>>>> round(as.numeric(unlist(strsplit(tclvalue(tkyview(datasetBox) ), " >>>>>>>>> "))[1])*len) >>>>>>>>> mat <- match(letter, >>> firstChar[-(1:current)]) >>>>>>>>> if (is.na(mat)) return() >>>>>>>>> tkyview.scroll(datasetBox, mat, "units") >>>>>>>>> } >>>>>>>>> onA <- function() onLetter("a") >>>>>>>>> onB <- function() onLetter("b") >>>>>>>>> onC <- function() onLetter("c") >>>>>>>>> onD <- function() onLetter("d") >>>>>>>>> onE <- function() onLetter("e") >>>>>>>>> onF <- function() onLetter("f") >>>>>>>>> onG <- function() onLetter("g") >>>>>>>>> onH <- function() onLetter("h") >>>>>>>>> onI <- function() onLetter("i") >>>>>>>>> onJ <- function() onLetter("j") >>>>>>>>> onK <- function() onLetter("k") >>>>>>>>> onL <- function() onLetter("l") >>>>>>>>> onM <- function() onLetter("m") >>>>>>>>> onN <- function() onLetter("n") >>>>>>>>> onO <- function() onLetter("o") >>>>>>>>> onP <- function() onLetter("p") >>>>>>>>> onQ <- function() onLetter("q") >>>>>>>>> onR <- function() onLetter("r") >>>>>>>>> onS <- function() onLetter("s") >>>>>>>>> onT <- function() onLetter("t") >>>>>>>>> onU <- function() onLetter("u") >>>>>>>>> onV <- function() onLetter("v") >>>>>>>>> onW <- function() onLetter("w") >>>>>>>>> onX <- function() onLetter("x") >>>>>>>>> onY <- function() onLetter("y") >>>>>>>>> onZ <- function() onLetter("z") >>>>>>>>> for (letter in c(letters, LETTERS)){ >>>>>>>>> tkbind(datasetBox, paste("<", letter, ">", >>> sep=""), >>>>>>>>> get(paste("on", >>> toupper(letter), >>>>>>>>> sep=""))) >>>>>>>>> } >>>>>>>>> onClick <- function() tkfocus(datasetBox) >>>>>>>>> tkbind(datasetBox, "<ButtonPress-1>", onClick) >>>>>>>>> } >>>>>>>>> onDatasetSelect <- function(){ >>>>>>>>> tclvalue(dsname) <- >>>>>>>>> datasets[as.numeric(tkcurselection(datasetBox)) + 1] >>>>>>>>> } >>>>>>>>> firstChar <- tolower(substr(packages, 1, 1)) >>>>>>>>> len <- length(packages) >>>>>>>>> onLetter <- function(letter){ >>>>>>>>> letter <- tolower(letter) >>>>>>>>> current <- 1 + >>>>>>>>> round(as.numeric(unlist(strsplit(tclvalue(tkyview(packageBox) ), " >>>>>>>>> "))[1])*len) >>>>>>>>> mat <- match(letter, firstChar[-(1:current)]) >>>>>>>>> if (is.na(mat)) return() >>>>>>>>> tkyview.scroll(packageBox, mat, "units") >>>>>>>>> } >>>>>>>>> onA <- function() onLetter("a") >>>>>>>>> onB <- function() onLetter("b") >>>>>>>>> onC <- function() onLetter("c") >>>>>>>>> onD <- function() onLetter("d") >>>>>>>>> onE <- function() onLetter("e") >>>>>>>>> onF <- function() onLetter("f") >>>>>>>>> onG <- function() onLetter("g") >>>>>>>>> onH <- function() onLetter("h") >>>>>>>>> onI <- function() onLetter("i") >>>>>>>>> onJ <- function() onLetter("j") >>>>>>>>> onK <- function() onLetter("k") >>>>>>>>> onL <- function() onLetter("l") >>>>>>>>> onM <- function() onLetter("m") >>>>>>>>> onN <- function() onLetter("n") >>>>>>>>> onO <- function() onLetter("o") >>>>>>>>> onP <- function() onLetter("p") >>>>>>>>> onQ <- function() onLetter("q") >>>>>>>>> onR <- function() onLetter("r") >>>>>>>>> onS <- function() onLetter("s") >>>>>>>>> onT <- function() onLetter("t") >>>>>>>>> onU <- function() onLetter("u") >>>>>>>>> onV <- function() onLetter("v") >>>>>>>>> onW <- function() onLetter("w") >>>>>>>>> onX <- function() onLetter("x") >>>>>>>>> onY <- function() onLetter("y") >>>>>>>>> onZ <- function() onLetter("z") >>>>>>>>> for (letter in c(letters, LETTERS)){ >>>>>>>>> tkbind(packageBox, paste("<", letter, ">", sep=""), >>>>>>>>> get(paste("on", toupper(letter), >>> sep=""))) >>>>>>>>> } >>>>>>>>> onClick <- function() tkfocus(packageBox) >>>>>>>>> tkbind(packageBox, "<ButtonPress-1>", onClick) >>>>>>>>> onOK <- function(){ >>>>>>>>> datasetName <- >>>>>>>>> datasets[as.numeric(tkcurselection(datasetBox)) + 1] >>>>>>>>> dsnameValue <- tclvalue(dsname) >>>>>>>>> if (dsnameValue != "" && is.null(package)){ >>>>>>>>> closeDialog() >>>>>>>>> if (is.element(dsnameValue, listDataSets())) >>> { >>>>>>>>> if ("no" == >>>>>>>>> tclvalue(checkReplace(dsnameValue, gettextRcmdr("Data set")))){ >>>>>>>>> if (GrabFocus()) >>> tkgrab.release(top) >>>>>>>>> tkdestroy(top) >>>>>>>>> readDataFromPackage() >>>>>>>>> return() >>>>>>>>> } >>>>>>>>> } >>>>>>>>> save.options <- options(warn=2) >>>>>>>>> check <- >>> try(eval(parse(text=logger(paste("data(", >>>>>>>>> dsnameValue, ")", sep=""))), >>>>>>>>> >>> envir=.GlobalEnv), >>>>>>>>> silent=TRUE) >>>>>>>>> options(save.options) >>>>>>>>> if (class(check) == "try-error"){ >>>>>>>>> >>> errorCondition(recall=readDataFromPackage, >>>>>>>>> >>>>>>>>> message=sprintf(gettextRcmdr("Data set %s does not exit"), >>>>>>>> dsnameValue)) >>>>>>>>> return() >>>>>>>>> } >>>>>>>>> activeDataSet(dsnameValue) >>>>>>>>> tkfocus(CommanderWindow()) >>>>>>>>> } >>>>>>>>> else{ >>>>>>>>> if (is.null(package)) { >>>>>>>>> >>> errorCondition(recall=readDataFromPackage, >>>>>>>>> message=gettextRcmdr("You must select a package.")) >>>>>>>>> return() >>>>>>>>> } >>>>>>>>> if (length(datasetName) == 0) { >>>>>>>>> >>> errorCondition(recall=readDataFromPackage, >>>>>>>>> message=gettextRcmdr("You must select a data set.") ) >>>>>>>>> return() >>>>>>>>> } >>>>>>>>> if (is.element(datasetName, listDataSets())) >>> { >>>>>>>>> if ("no" == >>>>>>>>> tclvalue(checkReplace(datasetName, gettextRcmdr("Data set")))){ >>>>>>>>> if (GrabFocus()) >>> tkgrab.release(top) >>>>>>>>> tkdestroy(top) >>>>>>>>> readDataFromPackage() >>>>>>>>> return() >>>>>>>>> } >>>>>>>>> } >>>>>>>>> closeDialog() >>>>>>>>> command <- paste("data(", datasetName, ', >>>>>>>>> package="', package, '")', sep="") >>>>>>>>> result <- justDoIt(command) >>>>>>>>> logger(command) >>>>>>>>> if (class(result)[1] != "try-error") >>>>>>>>> activeDataSet(datasetName) >>>>>>>>> tkfocus(CommanderWindow()) >>>>>>>>> } >>>>>>>>> } >>>>>>>>> onDataHelp <- function(){ >>>>>>>>> datasetName <- datasets[as.numeric(tkcurselection(datasetBox)) >>>> + >>>>>> 1] >>>>>>>>> dsnameValue <- tclvalue(dsname) >>>>>>>>> if (dsnameValue == "") dsnameValue <- datasetName >>>>>>>>> if (length(dsnameValue) == 0) >>> Message(gettextRcmdr("No >>>> data >>>>>>>>> set selected."), type="warning") >>>>>>>>> else if (is.null(package)) >>> doItAndPrint(paste('help("', >>>>>>>>> dsnameValue, '")', sep="")) >>>>>>>>> else doItAndPrint(paste('help("', dsnameValue, '", >>>>>>>>> package="', package, '")', sep="")) >>>>>>>>> } >>>>>>>>> OKCancelHelp(helpSubject="data") >>>>>>>>> dataHelpButton <- buttonRcmdr(top, text=gettextRcmdr("Help >>> on >>>>>>>>> selected data set"), command=onDataHelp) >>>>>>>>> tkgrid(labelRcmdr(packageDatasetFrame, >>>> text=gettextRcmdr("Package >>>>>>>>> (Double-click to select)"), fg=getRcmdr("title.color"), >>>>>>>>> font="RcmdrTitleFont"), >>>>>>>>> labelRcmdr(packageDatasetFrame, text=" "), >>>>>>>>> labelRcmdr(packageDatasetFrame, text=gettextRcmdr("Data set >>>> (Double- >>>>>>>> click to >>>>>>>>> select)"), >>>>>>>>> fg=getRcmdr("title.color"), >>>>>>>>> font="RcmdrTitleFont"), sticky="w") >>>>>>>>> tkgrid(packageBox, packageScroll, sticky="nw") >>>>>>>>> tkgrid(datasetBox, datasetScroll, sticky="nw") >>>>>>>>> tkgrid(packageFrame, labelRcmdr(packageDatasetFrame, text=" >>>> "), >>>>>>>>> datasetFrame, sticky="nw") >>>>>>>>> tkgrid(packageDatasetFrame, sticky="w") >>>>>>>>> tkgrid(labelRcmdr(top, text=gettextRcmdr("OR"), fg="red"), >>>>>>>>> sticky="w") >>>>>>>>> tkgrid(labelRcmdr(enterFrame, text=gettextRcmdr("Enter name >>>> of data >>>>>>>>> set: "), fg=getRcmdr("title.color"), font="RcmdrTitleFont"), >>>>>>>> entryDsname, >>>>>>>>> sticky="w") >>>>>>>>> tkgrid(enterFrame, sticky="w") >>>>>>>>> tkgrid(dataHelpButton, sticky="w") >>>>>>>>> tkgrid(buttonsFrame, sticky="ew") >>>>>>>>> tkgrid.configure(packageScroll, sticky="ns") >>>>>>>>> tkgrid.configure(datasetScroll, sticky="ns") >>>>>>>>> tkbind(packageBox, "<Double-ButtonPress-1>", >>> onPackageSelect) >>>>>>>>> tkbind(datasetBox, "<Double-ButtonPress-1>", >>> onDatasetSelect) >>>>>>>>> dialogSuffix(focus=entryDsname) >>>>>>>>> } >>>>>>>>> >>>>>>>>> -------- snip ---------- >>>>>>>>> >>>>>>>>> Any insight into the problem would be appreciated. >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> John >>>>>>>>> >>>>>>>>> ----------------------------------------------- >>>>>>>>> John Fox, Professor >>>>>>>>> McMaster University >>>>>>>>> Hamilton, Ontario, Canada >>>>>>>>> http://socserv.socsci.mcmaster.ca/jfox/ >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> --- >>>>>>>>> This email has been checked for viruses by Avast antivirus >>>> software. >>>>>>>>> https://www.avast.com/antivirus >>>>>>>>> >>>>>>>>> ______________________________________________ >>>>>>>>> R-package-devel@r-project.org mailing list >>>>>>>>> https://stat.ethz.ch/mailman/listinfo/r-package-devel >>>>>>>> >>>>>>>> -- >>>>>>>> Peter Dalgaard, Professor, >>>>>>>> Center for Statistics, Copenhagen Business School >>>>>>>> Solbjerg Plads 3, 2000 Frederiksberg, Denmark >>>>>>>> Phone: (+45)38153501 >>>>>>>> Email: pd....@cbs.dk Priv: pda...@gmail.com >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> --- >>>>>>> This email has been checked for viruses by Avast antivirus software. >>>>>>> https://www.avast.com/antivirus >>>>>>> >>>>>>> ______________________________________________ >>>>>>> R-package-devel@r-project.org mailing list >>>>>>> https://stat.ethz.ch/mailman/listinfo/r-package-devel >>>>>>> >>>>> >>>>> >>>>> --- >>>>> This email has been checked for viruses by Avast antivirus software. >>>>> https://www.avast.com/antivirus >>>>> >>> >>> >>> --- >>> This email has been checked for viruses by Avast antivirus software. >>> https://www.avast.com/antivirus >>> >> > > ------------------------------------------------ > John Fox, Professor > McMaster University > Hamilton, Ontario, Canada > http://socserv.mcmaster.ca/jfox/ > > > > ______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel