Hi, Bert:

On 2/9/2016 11:46 AM, Bert Gunter wrote:
Oh, yes certainly. But I thought the point was to avoid "cheating"
with with() or assuming that the "x" argument was a formula.

Yes, my "smarter" solution doesn't work  -- my error. I still think
there must be a small tweak to fix it, but I haven't figured it out
yet. AFAICS, my earlier "stupid" solution does work as originally
intended with no "cheating" :

plotxy <- function(x,data = NULL,...){
+    mcall <- match.call()
+    if(inherits(x,"formula"))enc <- environment(x)
+     else enc <- parent.frame()
+    if(!is.null(data)){
+         env <- data
+         mcall <- mcall[-match("data",names(mcall))]
+    } else env <- NULL
+    mcall[[1]] <- plot.default
+    eval(mcall,envir=env,enclos=enc)
+ }


  XY <- data.frame(x1=1:3, y1=4:6)
  plotxy(y1~x1, XY, xlim=c(0, max(x1)))
The problem with your original approach I believe is that the
evaluator wants to evaluate xlim before it passes it on to your plot
call. By default, it evaluates it in the parent frame where there is
no x1 -- ergo the error (I would appreciate correction if this is
wrong).  If you look at the code for plot.default() and then
grDevices:: xy.coords, you'll see how the call is parsed and evaluated
in the appropriate environment.  My code above is trying to do the
same thing, though I may still have holes.


Thanks. I failed to mention that I also wanted the same function to work with a time series, class "ts". Amazingly, my "plot.sg" worked with an object of class "ts", but your "plotxy" didn't plot what I wanted:


y.ts <- ts(matrix(1:6, 3), 7)

plotxy(y.ts)
# plots the first series as points and ignores the second
plot.sg(y.ts) # works as desired


When I replaced "plot.default" with "plot" in your "plotxy", plotxy(y.ts) performed as desired, but plotxy(y1~x1, XY, xlim=c(0, max(x1))) threw an error.


The following revision of your function works:


plotxy <- function(x, data = NULL,...){
    mcall <- match.call()
    if(inherits(x,"formula"))enc <- environment(x)
     else enc <- parent.frame()
    if(!is.null(data)){
         env <- data
         mcall <- mcall[-match("data",names(mcall))]
    } else env <- NULL
    mcall[[1]] <- (if(is.ts(x)) plot else plot.default)
    eval(mcall,envir=env,enclos=enc)
}

plotxy(y1~x1, XY, xlim=c(0, max(x1))) # good
plotxy(y.ts) # good


However, this will be embedded in a vignette on time series analysis, so I think I'll stick with the simpler "with" solution.


      Thanks again,
      Spencer

Cheers,
Bert




Cheers,
Bert

Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Tue, Feb 9, 2016 at 8:33 AM, Spencer Graves
<spencer.gra...@effectivedefense.org> wrote:

On 2/9/2016 9:51 AM, Bert Gunter wrote:
Spencer, et. al.:

As I suspected, my previous "solution" was pretty stupid. Here is, I
think, the "right" way to
   go about it:

   plotxy <- function(x,...){
     mcall <- match.call(expand.dots=FALSE)
     mcall[[1]]<- plot.default
     eval(mcall)
   }


Hi, Bert, et al.:  I couldn't get that to work, either:


XY <- data.frame(x1=1:3, y1=4:6)
plotxy(y1~x1, XY, xlim=c(0, max(x1)))
  Error in eval(expr, envir, enclos) : object 'y1' not found


       However, my original function inside "with" worked, but Bert's
suggestion didn't:


plot.sg <- function(x, ...){
+ plot(x, ...)
+ }
with(XY, plot.sg(y1~x1, xlim=c(0, max(x1))))
# worked, but "plotxy" with match.call didn't:
with(XY, plotxy(y1~x1, xlim=c(0, max(x1))))
  Error in eval(expr, envir, enclos) : object 'y1' not found

sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.2 (El Capitan)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods base

loaded via a namespace (and not attached):
[1] tools_3.2.3


       I don't understand this, but "with" is acceptable for my current
needs.


       Thanks again to Bert & Jeff.


       Spencer Graves

Best,
Bert



Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Mon, Feb 8, 2016 at 8:10 PM, Spencer Graves
<spencer.gra...@effectivedefense.org> wrote:
Hi, Jeff et al.:


On 2/8/2016 9:52 PM, Jeff Newmiller wrote:
plotxy(y1~x1, XY, xlim=c(0, max(XY$x1)))

         Yes, Thanks.


         Is there a way to do this from within "plotxy", so I can call
"plotxy" as I call "plot"?


         Thanks,
         Spencer


--
Sent from my phone. Please excuse my brevity.

On February 8, 2016 7:17:57 PM PST, Spencer Graves
<spencer.gra...@effectivedefense.org> wrote:

      I'm getting an interesting error:


          plotxy <- function(x, ...){

      +   plot(x, ...)
      + }

          XY <- data.frame(x1=1:3, y1=4:6) plotxy(y1~x1, XY, xlim=c(0,
          max(x1)))

         Show Traceback

         Rerun with Debug
         Error in eval(expr, envir, enclos) : object 'x1' not found


              The following work:


      plotxy(y1~x1, XY)
      plot(y1~x1, XY, xlim=c(0, max(x1)))


              Within "plotxy", R can't find "x1" to compute "xlim".  Is
there a
      way I can make x1 available to xlim?


              Thanks,
              Spencer


------------------------------------------------------------------------

      R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
      https://stat.ethz.ch/mailman/listinfo/r-help
      PLEASE do read the posting
guidehttp://www.R-project.org/posting-guide.html
      and provide commented, minimal, self-contained, reproducible code.

          [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to