Function in default parameter value closing over variables defined later in the enclosing function
Dear Jan & Duncan, Thanks for your replies! On Wed, 23 Jan 2019 09:56:25 -0500
Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
Defaults of variables are evaluated in the evaluation frame of the call. So the inside() function is created in the evaluation frame, and it's environment will be that frame.
When it is called it will create a new evaluation frame (empty in your example), with a parent being its environment, i.e. the evaluation frame from when it was created, so it will be able to see your secret variable.
Nice explanation about closures in R inheriting not only their explicitly captured variables, but whole environments of evaluation (not stack) frames where they have been created.
in my opinion it would be fine to write it as
outside <- function(inside = defaultInsideFn) {
defaultInsideFn <- function() print(secret)
secret <- 'secret'
inside()
}
I like this idea; I'm going to use it.
Best regards, Ivan