[R-pkg-devel] "invalid 'envir' argument" note from R-devel
John Fox
jfox at mcmaster.ca
Mon Jul 13 22:31:38 CEST 2015
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
More information about the R-package-devel
mailing list