Jens Oehlschlägel wrote: > Sean, > > >> would like to receive expert opinion to avoid potential trouble >> > [..] > >> i think the following is the most secure way if one really >> really has to do assignment in a function call >> f({a=3}) >> and if one keeps this convention, <- can be dropped altogether. >> > > secure is relative, since due to R's lazy evaluation you never know whether a > function's argument is being evalutated,
for sure, but that's not different between <- and {=}. in both cases, if the argument is not used, assignment will not be made. >> f<- function(x)TRUE >> x <- 1 >> f((x=2)) # obscured attempt to assign in a function call >> > [1] TRUE > >> x >> > [1] 1 > same with f(x<-2) > Thus there is dangerous advice in the referenced blog which reads: > " > f(x <- 3) > which means "assign 3 to x, and call f with the first argument set to the > value 3 > " > This might be the case in C but not in R. Actually in R "f(x <- 3)" means: > call f with a first unevaluated argument "x <- 3", and if and only if f > decides to evaluate its first argument, then the assignment is done. indeed. i have already argued that using assignment within function calls is not a good idea; but pick any book on r, you likely to find numerous examples of it, without an appropriate warning. <snip> > > Here it is unpredictable whether your assignment takes place. Thus assigning > like f({x=1}) or f((x=1)) or f(x<-1) > is the maximum dangerous thing to do: even if you have a code-reviewer and > the guy is aware of the danger of f(x<-1) he will probably miss it because > f((x=1)) does look too similar to a standard call f(x=1). > sorry, to me f({x=1}) looks pretty much unlike f(x=1). if someone uses assignments in function calls and does not know what he's doing, it's his fault. > According to help("<-"), R's assignment operator is rather "<-" than "=": > > " > The operators <- and = assign into the environment in which they are > evaluated. The operator <- can be used anywhere, whereas the operator = is > only allowed at the top level (e.g., in the complete expression typed at the > command prompt) or as one of the subexpressions in a braced list of > expressions. > to me, it doesn't say anything like that R's assignment operator is rather "<-" than "=". > " > > So my recommendation is > 1) use R's assignment operator with two spaces around (or assign()) and don't > obscure ... but do beautify ... > assignments by using C's don't acknowledge c for it > assignment operator (or other languages equality operator) > 2) do not assign in function arguments unless you have good reasons like in > system.time(x <- something) > certainly good advice. > > P.P.S. a puzzle, following an old tradition: > > What is going on here? (and what would you need to do to prove it?) > complete mystery to me. cheers, vQ ______________________________________________ R-help@r-project.org 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.