When trying out some variations with `[.data.frame` I noticed some (to me) odd
behaviour, which I found out has nothing to do with `[.data.frame`, but rather
with the way arguments are matched, when mixing named/unnamed and
missing/non-missing arguments. Consider the following example:
myfun <- function(x,y,z) {
? print(match.call())
? cat('x=',if(missing(x)) 'missing' else x, '\n')
? cat('y=',if(missing(y)) 'missing' else y, '\n')
? cat('z=',if(missing(z)) 'missing' else z, '\n')
}
myfun(x=, y=, "z's value")
gives:
# myfun(x = "z's value")
# x= z's value
# y= missing
# z= missing
This seems very counterintuitive to me, I expect the arguments x and y to be
missing, and z to get ?z?s value?.
When I call myfun(,y=,"z's value"), x is missing, and y gets ?z?s
value?.
Are my expectations wrong or is this a bug? And if my expectations are wrong,
where can I find more information on argument-matching?
My gut-feeling says to call this a bug, but then I?m surprised no-one else has
encountered it before.
And I don?t have multiple installations to work from, so could somebody else
confirm this (if it?s not my expectations that are wrong) for R-devel/other
R-versions/other platforms?
My setup: R 3.5.1, MacOS 10.13.6, both Rstudio 1.1.453 and R --vanilla from Bash
Best regards,
Emil Bode
On Thu, Nov 29, 2018 at 5:09 AM Emil Bode <emil.bode at dans.knaw.nl> wrote:> > When trying out some variations with `[.data.frame` I noticed some (to me) odd behaviour, which I found out has nothing to do with `[.data.frame`, but rather with the way arguments are matched, when mixing named/unnamed and missing/non-missing arguments. Consider the following example: > > > > myfun <- function(x,y,z) { > > print(match.call()) > > cat('x=',if(missing(x)) 'missing' else x, '\n') > > cat('y=',if(missing(y)) 'missing' else y, '\n') > > cat('z=',if(missing(z)) 'missing' else z, '\n') > > } > > myfun(x=, y=, "z's value") > > > > gives: > > > > # myfun(x = "z's value") > > # x= z's value > > # y= missing > > # z= missing > > > > This seems very counterintuitive to me, I expect the arguments x and y to be missing, and z to get ?z?s value?.Interesting. I would expect it to throw an error, since "x=" is not syntactically complete. What does "x=" mean anyway? It looks like R interprets it as "x was not set to anything, i.e., is missing". That seems reasonable, though I think the example itself is pathological and would prefer that it produced an error. --Ista> > When I call myfun(,y=,"z's value"), x is missing, and y gets ?z?s value?. > > Are my expectations wrong or is this a bug? And if my expectations are wrong, where can I find more information on argument-matching? > > My gut-feeling says to call this a bug, but then I?m surprised no-one else has encountered it before. > > > > And I don?t have multiple installations to work from, so could somebody else confirm this (if it?s not my expectations that are wrong) for R-devel/other R-versions/other platforms? > > My setup: R 3.5.1, MacOS 10.13.6, both Rstudio 1.1.453 and R --vanilla from Bash > > > > Best regards, > > Emil Bode > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
> When trying out some variations with `[.data.frame` I noticed some (to me) > odd behaviour,Not just in 'myfun' ... plot(x=1:10, y=) plot(x=1:10, y=, 10:1) In both cases, 'y=' is ignored. In the first, the plot is for y=NULL (so not 'missing' y) In the second case, 10:1 is positionally matched to y despite the intervening 'missing' 'y=' So it isn't just 'missing'; it's 'not there at all' Steve E> -----Original Message----- > From: R-devel [mailto:r-devel-bounces at r-project.org] On Behalf Of Emil > Bode > Sent: 29 November 2018 10:09 > To: r-devel at r-project.org > Subject: [Rd] Unexpected argument-matching when some are missing > > When trying out some variations with `[.data.frame` I noticed some (to me) > odd behaviour, which I found out has nothing to do with `[.data.frame`, but > rather with the way arguments are matched, when mixing named/unnamed > and missing/non-missing arguments. Consider the following example: > > > > myfun <- function(x,y,z) { > > ? print(match.call()) > > ? cat('x=',if(missing(x)) 'missing' else x, '\n') > > ? cat('y=',if(missing(y)) 'missing' else y, '\n') > > ? cat('z=',if(missing(z)) 'missing' else z, '\n') > > } > > myfun(x=, y=, "z's value") > > > > gives: > > > > # myfun(x = "z's value") > > # x= z's value > > # y= missing > > # z= missing > > > > This seems very counterintuitive to me, I expect the arguments x and y to be > missing, and z to get ?z?s value?. > > When I call myfun(,y=,"z's value"), x is missing, and y gets ?z?s value?. > > Are my expectations wrong or is this a bug? And if my expectations are > wrong, where can I find more information on argument-matching? > > My gut-feeling says to call this a bug, but then I?m surprised no-one else has > encountered it before. > > > > And I don?t have multiple installations to work from, so could somebody else > confirm this (if it?s not my expectations that are wrong) for R-devel/other R- > versions/other platforms? > > My setup: R 3.5.1, MacOS 10.13.6, both Rstudio 1.1.453 and R --vanilla from > Bash > > > > Best regards, > > Emil Bode******************************************************************* This email and any attachments are confidential. Any use, copying or disclosure other than by the intended recipient is unauthorised. If you have received this message in error, please notify the sender immediately via +44(0)20 8943 7000 or notify postmaster at lgcgroup.com and delete this message and any copies from your computer and network. LGC Limited. Registered in England 2991879. Registered office: Queens Road, Teddington, Middlesex, TW11 0LY, UK
On Thu, Nov 29, 2018 at 10:51 AM S Ellison <S.Ellison at lgcgroup.com> wrote:> > > When trying out some variations with `[.data.frame` I noticed some (to me) > > odd behaviour, > > Not just in 'myfun' ... > > plot(x=1:10, y=) > plot(x=1:10, y=, 10:1) > > In both cases, 'y=' is ignored. In the first, the plot is for y=NULL (so not 'missing' y) > In the second case, 10:1 is positionally matched to y despite the intervening 'missing' 'y=' > > So it isn't just 'missing'; it's 'not there at all'What exactly is the difference between "missing" and "not there at all"? --Ista> > Steve E > > > -----Original Message----- > > From: R-devel [mailto:r-devel-bounces at r-project.org] On Behalf Of Emil > > Bode > > Sent: 29 November 2018 10:09 > > To: r-devel at r-project.org > > Subject: [Rd] Unexpected argument-matching when some are missing > > > > When trying out some variations with `[.data.frame` I noticed some (to me) > > odd behaviour, which I found out has nothing to do with `[.data.frame`, but > > rather with the way arguments are matched, when mixing named/unnamed > > and missing/non-missing arguments. Consider the following example: > > > > > > > > myfun <- function(x,y,z) { > > > > print(match.call()) > > > > cat('x=',if(missing(x)) 'missing' else x, '\n') > > > > cat('y=',if(missing(y)) 'missing' else y, '\n') > > > > cat('z=',if(missing(z)) 'missing' else z, '\n') > > > > } > > > > myfun(x=, y=, "z's value") > > > > > > > > gives: > > > > > > > > # myfun(x = "z's value") > > > > # x= z's value > > > > # y= missing > > > > # z= missing > > > > > > > > This seems very counterintuitive to me, I expect the arguments x and y to be > > missing, and z to get ?z?s value?. > > > > When I call myfun(,y=,"z's value"), x is missing, and y gets ?z?s value?. > > > > Are my expectations wrong or is this a bug? And if my expectations are > > wrong, where can I find more information on argument-matching? > > > > My gut-feeling says to call this a bug, but then I?m surprised no-one else has > > encountered it before. > > > > > > > > And I don?t have multiple installations to work from, so could somebody else > > confirm this (if it?s not my expectations that are wrong) for R-devel/other R- > > versions/other platforms? > > > > My setup: R 3.5.1, MacOS 10.13.6, both Rstudio 1.1.453 and R --vanilla from > > Bash > > > > > > > > Best regards, > > > > Emil Bode > > > > ******************************************************************* > This email and any attachments are confidential. Any u...{{dropped:11}}
Well, I did mean it as "missing".
To me, it felt just as natural as providing an empty index for subsetting (e.g.
some.data.frame[,,drop=FALSE])
I can't think of a whole lot of other uses than subsetting, but I think this
issue may be mostly important when you're not entirely sure what a call is
going to end up, when passing along arguments, or when calling an unknown
function (as in variants of the apply-family, where you provide a function as an
argument).
Or what happens if I use do.call(FUN, args=MyNamedList)? I have a bit more
extensive example further down where you can more clearly see the unexpected
output.
But the problem is that R does NOT treat it as simply "missing". That
would have been reasonable, but instead, as in the example in my previous mail,
myfun(x=, y=, "z's value") means x is assigned "z's
value", and y and z are seen as missing. Which is not at all what I was
expecting.
And is also not consistent with other behaviour, as myfun(,,"z's
value") and myfun(x=, y=, z="z's value") do work as expected
(at least what I was expecting)
The extensice example:
Suppose I want to write a function that selects data from some external source.
In order to do this, we put the data in its own environment, where we look for
variables called "df", "rows", "cols" and
"drop", and use these to make a selection. I write this function:
doselect <- function(env) {
do.call(`[.data.frame`, list(env$df, if(!is.null(env$rows)) env$rows,
if(!is.null(env$cols)) env$cols, drop=if(!is.null(env$drop)) env$drop))
}
It works for this code:
myenv <- new.env()
assign('df', data.frame(a=1:2, b=3:4), myenv, inherits=FALSE)
assign('rows', 1, myenv, inherits=FALSE) # Code breaks if we don't
have this line
assign('cols', 1, myenv, inherits=FALSE) # Code breaks if we don't
have this line
assign('drop', FALSE, myenv, inherits=FALSE)
doselect(myenv)
But if we don't assign "rows" and/or "cols", the
variable "drop" is inserted in the place of the first unnamed
variable, so the result is the same as if calling
df[FALSE,,]:
[1] a b
<0 rows> (or 0-length row.names)
What I did expect was the same result as df[,,FALSE], i.e. the full data.frame.
Of course I can rewrite the function "doselect", but I think my
current call is how most people would write it (even though I admit the example
in its entirety is far-fetched)
Best regards,
Emil Bode
?On 29/11/2018, 14:58, "Ista Zahn" <istazahn at gmail.com>
wrote:
On Thu, Nov 29, 2018 at 5:09 AM Emil Bode <emil.bode at dans.knaw.nl>
wrote:
>
> When trying out some variations with `[.data.frame` I noticed some (to
me) odd behaviour, which I found out has nothing to do with `[.data.frame`, but
rather with the way arguments are matched, when mixing named/unnamed and
missing/non-missing arguments. Consider the following example:
>
> myfun <- function(x,y,z) {
> print(match.call())
> cat('x=',if(missing(x)) 'missing' else x,
'\n')
> cat('y=',if(missing(y)) 'missing' else y,
'\n')
> cat('z=',if(missing(z)) 'missing' else z,
'\n')
> }
> myfun(x=, y=, "z's value")
>
> gives:
>
> # myfun(x = "z's value")
> # x= z's value
> # y= missing
> # z= missing
>
> This seems very counterintuitive to me, I expect the arguments x and y
to be missing, and z to get ?z?s value?.
Interesting. I would expect it to throw an error, since "x=" is
not
syntactically complete. What does "x=" mean anyway? It looks like
R
interprets it as "x was not set to anything, i.e., is missing".
That
seems reasonable, though I think the example itself is pathological
and would prefer that it produced an error.
--Ista
>
> When I call myfun(,y=,"z's value"), x is missing, and y
gets ?z?s value?.
> Are my expectations wrong or is this a bug? And if my expectations are
wrong, where can I find more information on argument-matching?
> My gut-feeling says to call this a bug, but then I?m surprised no-one
else has encountered it before.
>
> And I don?t have multiple installations to work from, so could somebody
else confirm this (if it?s not my expectations that are wrong) for R-devel/other
R-versions/other platforms?
>
> My setup: R 3.5.1, MacOS 10.13.6, both Rstudio 1.1.453 and R --vanilla
from Bash
>
> Best regards,
>
> Emil Bode
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel