[Rd] Warning with new placeholder piped to data.frame extractors `[` and `[[`.

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Mon Jul 18 22:06:45 CEST 2022


The code from gram.y that handles this looks like this in R-devel:

         /* allow top-level placeholder */
         for (SEXP a = CDR(rhs); a != R_NilValue; a = CDR(a))
             if (CAR(a) == R_PlaceholderToken) {
                 if (TAG(a) == R_NilValue)
                     raiseParseError("placeholderNotNamed", rhs,
                                     NO_VALUE, NULL, lloc_rhs,
                             _("pipe placeholder can only be used as a 
named argument (%s:%d:%d)"));
                 checkTooManyPlaceholders(rhs, CDR(a), lloc_rhs);
                 SETCAR(a, lhs);
                 return rhs;
             }

         check_rhs(rhs, lloc_rhs);

The "check_rhs" function is the one that complains about using `[` as a 
function on the right hand side.  So it is never run when there's a 
placeholder found.  Not sure if this is intentional or not.

You can see more context here: 
https://github.com/wch/r-source/blob/0ece3677bc1c4a1c76ecbcff62424d72d742d492/src/main/gram.y#L1248 
.

Duncan Murdoch



On 18/07/2022 3:48 p.m., Gabriel Becker wrote:
> It looks to me like the 'bug' here seems to be that
> 
> aggregate(y ~ f, df1, mean) |> `[`(x = _, 'y')
> 
> 
> does not throw the same error as
> 
> aggregate(y ~ f, df1, mean) |> `[`('y')
> 
> 
> Since the latter seems pretty clear that the intent is that `[` is
> disallowed on the RHS of the pipe by design.
> 
> ~G
> 
> 
> On Mon, Jul 18, 2022 at 11:07 AM Toby Hocking <tdhock5 using gmail.com> wrote:
> 
>> Is the intent is to encourage the user to do something simpler like...
>> aggregate(y ~ f, df1, mean)$y
>> aggregate(y ~ f, df1, mean)["y"]
>> aggregate(y ~ f, df1, mean)[["y"]]
>> ??
>>
>> On Sat, Jul 16, 2022 at 8:27 AM Rui Barradas <ruipbarradas using sapo.pt> wrote:
>>
>>> Hello,
>>>
>>> When piping to any of `[.data.frame` or `[[.data.frame`, the placeholder
>>> in mandatory.
>>>
>>>
>>> df1 <- data.frame(y = 1:10, f = rep(c("a", "b"), each = 5))
>>>
>>> aggregate(y ~ f, df1, mean) |> `[`('y')
>>> # Error: function '[' not supported in RHS call of a pipe
>>>
>>> aggregate(y ~ f, df1, mean) |> `[[`('y')
>>> # Error: function '[' not supported in RHS call of a pipe
>>>
>>>
>>>
>>> But if used it throws a warning.
>>>
>>>
>>>
>>> aggregate(y ~ f, df1, mean) |> `[`(x = _, 'y')
>>> #  Warning in `[.data.frame`(x = aggregate(y ~ f, df1, mean), "y"):
>>> named arguments
>>> #  other than 'drop' are discouraged
>>> #    y
>>> #  1 3
>>> #  2 8
>>>
>>> aggregate(y ~ f, df1, mean) |> `[[`(x = _, 'y')
>>> #  Warning in `[[.data.frame`(x = aggregate(y ~ f, df1, mean), "y"):
>> named
>>> #  arguments other than 'exact' are discouraged
>>> #  [1] 3 8
>>>
>>>
>>>
>>> Hasn't this become inconsistent behavior?
>>> More than merely right, the named argument is mandatory, it shouldn't
>>> give warnings.
>>>
>>> Hope this helps,
>>>
>>> Rui Barradas
>>>
>>> ______________________________________________
>>> R-devel using r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>
>>          [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list