[Rd] Private environments and/or assignInMyNamespace
Milan Bouchet-Valat
nalimilan at club.fr
Wed Feb 13 14:24:01 CET 2013
Le mercredi 13 février 2013 à 13:16 +0100, Ulrike Grömping a écrit :
> Milan,
>
> I am not closing the dialog, but without the dialog in the search space,
> I cannot properly refer to it any more using e.g. the Rcmdr function
> errorCondition.
> It has been a long time ago that I wrote this; I don't have a small
> reproducible example right now. Below is an example of what I do in
> function Menu.pb2level:
>
> I am using function justDoItDoE (instead of Rcmdr justDoIt, because
> justDoIt puts the focus in the wrong place for my purpose; have to adapt
> to RStudio here!):
> justDoItDoE <- function (command)
> {
> Message()
> if (!getRcmdr("suppress.X11.warnings")) {
> messages.connection <- file(open = "w+")
> sink(messages.connection, type = "message")
> on.exit({
> sink(type = "message")
> close(messages.connection)
> })
> }
> else messages.connection <- getRcmdr("messages.connection")
> result <- try(eval(parse(text = command), envir = .GlobalEnv))
> if (!class(result)[1] == "try-error")
> Rcmdr:::checkWarnings(readLines(messages.connection))
> result
> }
> <environment: namespace:RcmdrPlugin.DoE>
>
> Subsequently, I am using the Rcmdr function errorCondition:
> errorCondition <- function (window = top, recall = NULL, message =
> stop("message not supplied"),
> model = FALSE)
> {
> tmp <- substitute({
> on.exit(remove(list = objects(pattern = "^\\.\\.", all.names =
> TRUE)))
> if (model) putRcmdr("modelNumber", getRcmdr("modelNumber") -
> 1)
> if (!is.null(window)) {
> if (GrabFocus()) tkgrab.release(window)
> tkdestroy(window)
> }
> Message(message = message, type = "error")
> if (!is.null(recall)) recall() else tkfocus(CommanderWindow())
> })
> eval(tmp, parent.frame())
> }
>
> Function errorCondition has to find the dialog topdes2, and I have to be
> inside function Menu.pb2level again:
> hilf <- justDoItDoE(command)
> if (class(hilf)[1] == "try-error") {
> errorCondition(window = topdes2, recall = Menu.pb2level,
> message = gettextRcmdr(hilf))
> return()
> }
>
> This code does not work with topdes2 not in the search path, and when I
> tried before, it did also not work with getRcmdr("topdes2") instead of
> topdes2 - but maybe, I just was not following this approach through
> thoroughly enough.
>
> Any thoughts whether the storage of widgets in an environment off the
> search path might work (when properly followed through, which will be a
> lot of work)? Or any suggestion how else I can achieve what I try to do?
OK, this is what I suspected. John should probably comment this
statement, but I do not really understand the purpose of the
errorCondition() function. I've stopped using it in my own RCommander
plug-in.
What I would do if I had to solve your problem is to call return()
instead of errorCondition(), so that the dialog is left as-is. To tell
the user that something is wrong, you can use Message(), or show an
error dialog or a label in the original dialog right before calling
return(). This is the simplest solution and it does not require any
programming trick. But maybe I'm missing something. ;-)
My two cents
> Best, Ulrike
>
> Am 13.02.2013 10:12, schrieb Milan Bouchet-Valat:
> > Le mardi 12 février 2013 à 14:45 +0100, Ulrike Grömping a écrit :
> >> Dear DevelopeRs,
> >>
> >> I've been struggling with the new regulations regarding modifications to
> >> the search path, regarding my Rcmdr plugin package RcmdrPlugin.DoE. John
> >> Fox made Rcmdr comply with the new policy by removing the environment
> >> RcmdrEnv from the search path. For the time being, he developed an
> >> option that allows users to put the environment from Rcmdr (RcmdrEnv) on
> >> the search path, like in earlier versions of Rcmdr (thanks John!), which
> >> rescues my package for the immediate future; however, in the long run it
> >> would be nice to be able to make it work without that.
> >>
> >> The reason why I currently need the environment on the search path (may
> >> be due to my lack of understanding how tcltk widgets are handled): I
> >> have quite elaborate notebook widgets on which users can make many
> >> entries. Some entries are only checked after clicking OK, and if an
> >> error is found at that point, the user receives a small message window
> >> that has to be confirmed and is subsequently returned to the notebook
> >> widget in the state it was in when pressing OK. These widgets are
> >> currently held in the environment RcmdrEnv; they work when RcmdrEnv is
> >> on the search path; however, it is not sufficient to retrieve them with
> >> John's function getRcmdr, which works fine for objects other than widgets.
> > I'm not sure I understand exactly how this works, but does that mean you
> > close the dialog before checking the entries? If it is the case, you
> > could check them before, and if an error is detected, you would keep the
> > dialog open: this way, you would not need to restore anything.
> >
> > Could you point us at the relevant code?
> >
> >
> > Regards
> >
> >> Here my question: Would it be an option to place the widgets in a
> >> private environment of my plugin package (then I would have to learn how
> >> to create one and work with it), or won't they be found that way?
> >> Alternatively, I could have unexported objects of all required names in
> >> my namespace and modify these via assignInMyNamespace (I don't think
> >> that anybody from somewhere else would import that namespace, it's not
> >> that kind of package). Would that be a viable alternative, and would the
> >> widgets be found that way? Any further ideas?
> >>
> >> Best regards,
> >> Ulrike
> >>
More information about the R-devel
mailing list