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

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to