[R] unexpected behavior when creating a list of functions
Thomas Lumley
tlumley at u.washington.edu
Thu Apr 5 00:49:45 CEST 2007
On Wed, 4 Apr 2007, Matthew Suderman wrote:
> I wanted to create a list of functions whose output differs depending
> the value of a variable when the function was created. Generally this
> did not work. Each function was exactly the same, as in the simple
> example below:
>
> get_data_function <- function(v) {
> function() {
> print(v)
> }
> }
> data_functions <- sapply(1:10,function(v) get_data_function(v))
> (data_functions[[1]])() # prints 10!
>
> However, if I insert a statement in get_data_function to print argument
> v, then I get the different functions that I wanted:
>
> get_data_function <- function(v) {
> print(v)
> function() {
> print(v)
> }
> }
> data_functions <- sapply(1:10,function(v) get_data_function(v))
> (data_functions[[1]])() # prints 1, as expected!
>
> I have two questions about this:
> * Is this a bug in R?
No, it's lazy evaluation at work.
> * Is there a more direct way to get the effect of printing v?
The function force() is designed for this -- it doesn't do anything
special that any other evaluation wouldn't do, but it makes clear that all
you are doing is forcing evaluation.
-thomas
More information about the R-help
mailing list