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 > ______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel