[R] argument "x" is missing in minpack.lm

Stephen Ellison S@E|||@on @end|ng |rom LGCGroup@com
Tue Jun 30 21:59:03 CEST 2020


Ivan Krylov [krylov.r00t using gmail.com] said:
>  Instead you can either close over X:
> 
> X <- c(...)
> holly <- function(p) (p$a * X^2) / (p:b^2 + X^2)
> # function holly now "contains" the vector X

That would not be an accurate statement as written.
The function only contains an unevaluated call referencing X; not the vector X. 
If X is not defined inside the function or its arguments, scoping rules take over and R goes looking in the function's environment, using the first thing called "X" that it finds.

So
X<-1:5
h <- function(p=2) p*X
h()
# works, but
X <- pi
h()
# Not the same answer. If the function 'contained' the vector, the result would be 2*(1:5) as above.
# This is why it's not wise to rely on scoping rules in functions, unless you _completely_ control the environment.

# and
rm(X)
h()
# returns an error because X is no longer defined, in the function or out of it, even though X was defined at the time h() was defined.

BUT 

X <- pi/2
fh <- function(p=2) {
        X <- 7
        h(p)
}
fh()
# returns pi and not 14 because h() was bound to the global environment on creation and still is when R finds it on evaluating h() in the fh() function body. 

Moral: if you want to be safe, pass it as an argument.


*******************************************************************
This email and any attachments are confidential. Any use...{{dropped:8}}



More information about the R-help mailing list