Hi, I wonder if the following is possible in R: Suppose a function takes an argument, and wants to modify this argument so that the change is visible _at the call side_. It would be what is for example known as pass-by-reference-to-non-const in C++. test <- function(x) { x <- 10 ... return (somethingElse) # I do NOT want having to return x } number = 5 test(number) stopifnot(number == 10) Is there some trick with scoping rules and maybe <<- to achieve this ? thanks, Thomas
Thomas Mang <thomas.mang <at> fiwi.at> writes:> I wonder if the following is possible in R: > > Suppose a function takes an argument, and wants to modify this argument > so that the change is visible _at the call side_. It would be what is > for example known as pass-by-reference-to-non-const in C++. > > test <- function(x) > { > x <- 10 > ... > return (somethingElse) # I do NOT want having to return x > } > > number = 5 > test(number) > stopifnot(number == 10) > > Is there some trick with scoping rules and maybe <<- to achieve this ?Yes, it is possible. No, don't do it (coming from the c++ world, I understand your temptation). Try to look for "assign" to see the attached flames. http://r-project.markmail.org/search/?q=assign Dieter
On Fri, 13 Mar 2009, Thomas Mang wrote:> Hi, > > I wonder if the following is possible in R: > > Suppose a function takes an argument, and wants to modify this argument so >that the change is visible _at the call side_. It would be what is for >example known as pass-by-reference-to-non-const in C++. > > test <- function(x) > { > x <- 10 > ... > return (somethingElse) # I do NOT want having to return x > } > > number = 5 > test(number) > stopifnot(number == 10) >It's possible in your example test<-function(x){ eval(substitute(x<-10),parent.frame()) return(42) } However, it is still likely to be a bad idea. What do you want to happen for test(5) test(x+y) test(test(y)) retest<-function(z) {z<-5; test(z); print(z)} retest(x) R really doesn't have pointer or reference types, and there's no way to ensure that the arguments to a function are lvalues. -thomas Thomas Lumley Assoc. Professor, Biostatistics tlumley at u.washington.edu University of Washington, Seattle