[R] Is it odd or not? about I() function

peter dalgaard pd@|gd @end|ng |rom gm@||@com
Sun Apr 20 23:24:36 CEST 2025


What Ben says. Also a bit of pragmatic advice:

If you want people to help you and run your scripts, don't precede each line with 9 characters that they'll have to remove to make it runnable. (Emacs users can do "C-x r k", but there aren't that many Emacs users around these days.)

Also, the script is overly complicated and expects the user to (install and) load a bunch of stuff, where the effect that you are talking about is just as clearly visible in simpler code like this.

ggplot(dta, aes(x = x, y = as.numeric(y)))+geom_line()
x <- 1:10; y <- rnorm(10) ; dta <- data.frame(x,y)
ggplot(dta, aes(x = x, y = y )) + geom_line()
ggplot(dta, aes(x = x, y = I(y) )) + geom_line()

However, like Ben, I'm not quite up to drilling into the ggplot code to see where things go wrong. 

Apparently, you can leave out the geom_line() bit and still get the odd y scale, so the issue is inside ggplot() it self and perhaps you could do something like debug(ggplot2:::ggplot_build.ggplot) and single-step and see if you can spot where and how the y scale is being set up.

-pd


> On 19 Apr 2025, at 23.15, Ben Bolker <bbolker using gmail.com> wrote:
> 
>  This is obviously not a complete answer, but if you look at the data closely:
> 
> str(dta)
> 'data.frame': 40 obs. of  6 variables:
> $ x             : num  0.915 0.937 0.286 0.83 0.642 ...
> $ y             : num  0.3796 0.4358 0.0374 0.9735 0.4318 ...
> $ z             : int  1 1 1 1 1 1 1 1 1 1 ...
> $ x_axis        : int  1 2 3 4 5 6 7 8 9 10 ...
> $ rslt_without_I: num  0.7657 0.8474 0.0516 1.1533 0.483 ...
> $ rslt_with_I   : 'AsIs' num  0.765658.... 0.847406.... 0.051648.... 1.153295.... 0.482993.... ...
> 
> you'll see that the two variables have different *classes*. Your '==' test checks to see if the *numeric values* of the elements are the same.
> 
> Both of these, which check the characteristics of the vector itself as well as the values of the elements, indicate that these vectors are indeed different.
> 
> identical(dta$rslt_with_I, dta$rslt_without_I)
> all.equal(dta$rslt_with_I, dta$rslt_without_I)
> 
>  In order to figure out *why* having class "AsIs" rather than class "numeric" makes the axis/breaks computation fail, you'd have to dig into the machinery (or, ask on the ggplot issues list -- the questions there involving "AsIs" mostly refer to a separate use case for "AsIs" ... https://github.com/tidyverse/ggplot2/issues?q=is%3Aissue%20AsIs )
> 
> 
> On 2025-04-18 9:46 p.m., Hiroto Miyoshi wrote:
>> Dear R expert
>> I encountered a bewildering situation, about which
>> I am seeking help.  I wrote a following toy script
>> which can recreate the situation.
>> --- the script begins here ---
>>     1   │ library(tidyverse)
>>     2   │ library(rlist)
>>     3   │ library(patchwork)
>>     4   │ set.seed(42)
>>     5   │ f <- function(x, y, z, x_axis) {
>>     6   │   rslt_with_I <- I(x^2 * 0.5) + I(x * y)
>>     7   │   rslt_without_I <- (x^2 * 0.5) + (x * y)
>>     8   │   out <- data.frame(rslt_without_I, rslt_with_I)
>>     9   │   return(out)
>>    10   │ }
>>    11   │
>>    12   │ df <- data.frame(
>>    13   │   x = runif(40, 0, 1),
>>    14   │   y = runif(40, 0, 1),
>>    15   │   z = rep(1:4, rep(10, 4)),
>>    16   │   x_axis = rep(1:10, 4)
>>    17   │ )
>>    18   │
>>    19   │ dta <- pmap(df, f) %>%
>>    20   │   list.stack(.) %>%
>>    21   │   cbind(df, .)
>>    22   │
>>    23   │ g1 <- ggplot(dta, aes(x = x_axis, y = rslt_with_I, color =
>> factor(z))) +
>>    24   │   geom_point() +
>>    25   │   geom_line()
>>    26   │ g2 <- ggplot(dta, aes(x = x_axis, y = rslt_without_I, color =
>> factor(z))) +
>>    27   │   geom_point() +
>>    28   │   geom_line()
>>    29   │
>>    30   │ g <- g1 | g2
>>    31   │ plot(g)
>>    32   │
>>    33   │ dta$rslt_with_I == dta$rslt_without_I
>>    34   │ # the end of the script
>> The two graphs, i.e. g1 and g2 are different and obviously, the data do not
>> fit in the graph area for g1. The command "dta$rslt_with_I ==
>> dta$rslt_without_I"
>> shows the plotted data are identical.  I want why this happens.
>> Sincerely
>> Hiroto
>> [[alternative HTML version deleted]]
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> 
> -- 
> Dr. Benjamin Bolker
> Professor, Mathematics & Statistics and Biology, McMaster University
> Director, School of Computational Science and Engineering
> > E-mail is sent at my convenience; I don't expect replies outside of working hours.
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business SchoolSolbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd.mes using cbs.dk  Priv: PDalgd using gmail.com



More information about the R-help mailing list