Note that ?transform.data.frame says arguments need to be named, so you are testing unspecified behaviour. I guess this falls in a similar category as the note

     If some of the values are not vectors of the appropriate length,
     you deserve whatever you get!

Experiments for a related Problem Report (<https://bugs.r-project.org/show_bug.cgi?id=17890>) showed that packages bravely ignore the caveats mentioned on the help page, including to assume recycling the rows of the input data frame. I didn't yet see any uses of unnamed arguments, though.

That said, I agree that transform.data.frame() should be improved. Maybe unnamed arguments should always be ignored with a warning. My feeling is that these would more often be usage errors than intentional, e.g.:

> data.frame(a = 1) |> transform(b = 2, a + 2)  # "forgetting" a=
  a b X3
1 1 2  3

I also think the implicit check.names=TRUE behaviour should be disabled. In

> list2DF(list(`A-1` = 1)) |> transform(B = 2)
  A.1 B
1   1 2

transforming B should not touch the other columns.

I'm less sure about some other forms of undocumented behaviour as described in Comment 6 of the linked PR.

        Sebastian Meyer


Am 02.03.23 um 18:49 schrieb Antoine Fabri:
Dear r-devel,

See below:


transform(data.frame(a = 1), 2, 3)

#>   a

#> 1 1


transform(data.frame(a = 1), b=2, 3)

#>   a b X3

#> 1 1 2  3


We need a small modification to make it work consistently, see below:


transform.data.frame <- function (`_data`, ...) {

   e <- eval(substitute(list(...)), `_data`, parent.frame())

   tags <- names(e)

   ## NEW LINE -----------------------------------------------

   if (is.null(tags)) tags <- character(length(e))

   inx <- match(tags, names(`_data`))

   matched <- !is.na(inx)

   if (any(matched)) {

     `_data`[inx[matched]] <- e[matched]

     `_data` <- data.frame(`_data`)

   }

   if (!all(matched))

     do.call("data.frame", c(list(`_data`), e[!matched]))

   else `_data`

}


transform(data.frame(a = 1), 2, 3)

#>   a X2 X3

#> 1 1  2  3

transform(data.frame(a = 1), b=2, 3)

#>   a b X3

#> 1 1 2  3


Thanks,


Antoine

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to