Peter Meilstrup
2013-Jan-23 23:08 UTC
[Rd] Arguments passing through dot-dot-dot lose ability to check for missing()?
Hi R-devel. Is the following behavior in g1() and h1() expected? It seems
to make "..." arguments work slightly differently from named
arguments.
#missing() has the property that it looks "up the chain"
#for example, "z" can be missing in f3 even if
#that argument did have a name ("y") in f2
f1 <- function(x, ...) {
cat("In f1, missing(x) is ", missing(x), "\n")
f2(x, ...)
}
f2 <- function(y, ...) {
cat("In f2, missing(y) is ", missing(y), "\n")
f3(y, ...)
}
f3 <- function(z, ...) {
cat("in f3, missing(z) is ", missing(z), "\n")
}
f1( , 2) #all TRUE
#does this also work with ... arguments? It seems to lose track.
g1 <- function(...) {
cat("In g1, missing(..1) is ", missing(..1), "\n")
g2(...)
}
g2 <- function(...) {
cat("In g2, missing(..1) is ", missing(..1), "\n")
g3(...)
}
g3 <- function(...) {
cat("in g3, missing(..1) is ", missing(..1), "\n")
}
g1( , 2) #TRUE, TRUE, FALSE ?!
# we can also elicit this lossiness without looking at the virtual ..n
# symbols:
h1 <- function(x, ...) {
cat("in h1, missing(x) is ", missing(x), "\n")
h2(x, ...)
}
hh1 <- function(...)
h2(...)
h2 <- function(...)
h3(...)
h3 <- function(z, ...)
cat("in h3, missing(z) is ", missing(z), "\n")
h3( , 1) #missing in h3
h2( , 1) #missing in h3
h1( , 1) #missing in h1 but NOT h3
hh1( , 1) #also not missing in h3
[[alternative HTML version deleted]]
Peter Meilstrup
2013-Feb-09 09:29 UTC
[Rd] Arguments passing through dot-dot-dot lose ability to check for missing()?
This seems related also. Using match.call to capture ... arguments returns
odd results for missing arguments. Compare against another method of
capturing ... expressions:
capture_subst <- function(...) eval(substitute(alist(...)))
capture_match <- function(...) match.call(expand.dots=FALSE)$...
f1 <- function(..., capture) {
capture(...)
}
f1(x=1, q=, capture=capture_subst)
f1(x=1, q=, capture=capture_match)
On Wed, Jan 23, 2013 at 3:08 PM, Peter Meilstrup
<peter.meilstrup@gmail.com>wrote:
> Hi R-devel. Is the following behavior in g1() and h1() expected? It seems
> to make "..." arguments work slightly differently from named
arguments.
>
> #missing() has the property that it looks "up the chain"
> #for example, "z" can be missing in f3 even if
> #that argument did have a name ("y") in f2
> f1 <- function(x, ...) {
> cat("In f1, missing(x) is ", missing(x), "\n")
> f2(x, ...)
> }
>
> f2 <- function(y, ...) {
> cat("In f2, missing(y) is ", missing(y), "\n")
> f3(y, ...)
> }
>
> f3 <- function(z, ...) {
> cat("in f3, missing(z) is ", missing(z), "\n")
> }
>
> f1( , 2) #all TRUE
>
> #does this also work with ... arguments? It seems to lose track.
> g1 <- function(...) {
> cat("In g1, missing(..1) is ", missing(..1), "\n")
> g2(...)
> }
>
> g2 <- function(...) {
> cat("In g2, missing(..1) is ", missing(..1), "\n")
> g3(...)
> }
>
> g3 <- function(...) {
> cat("in g3, missing(..1) is ", missing(..1), "\n")
> }
>
> g1( , 2) #TRUE, TRUE, FALSE ?!
>
> # we can also elicit this lossiness without looking at the virtual ..n
> # symbols:
>
> h1 <- function(x, ...) {
> cat("in h1, missing(x) is ", missing(x), "\n")
> h2(x, ...)
> }
>
> hh1 <- function(...)
> h2(...)
>
> h2 <- function(...)
> h3(...)
>
> h3 <- function(z, ...)
> cat("in h3, missing(z) is ", missing(z), "\n")
>
> h3( , 1) #missing in h3
> h2( , 1) #missing in h3
> h1( , 1) #missing in h1 but NOT h3
> hh1( , 1) #also not missing in h3
>
[[alternative HTML version deleted]]