[R] How to modify the body of a function?
Richard M. Heiberger
rmh at temple.edu
Mon Jul 28 06:00:46 CEST 2014
Now THAT is a fortune:
My preferences are colored by my experience looking for problems in
other people's code. My own code is always easy to understand but
code other people write can be difficult. :-)
On Sun, Jul 27, 2014 at 8:38 PM, William Dunlap <wdunlap at tibco.com> wrote:
> The problem with Don's
> if (condition) {
> Results <- something
> } else {
> Results <- somethingElse
> }
> is that in a long sequence of if-then-else-if... you have
> to check every branch to make sure Results got assigned to
> (or that the remaining branches contained a return() or a stop()).
>
> Duncan's version may be more readable if you explicitly assign
> the value of the if-then-else to a variable and then return the variable
> Results <- if (condition) {
> something
> } else {
> somethingElse
> }
> Return
>
> I think the original poster may have wanted to put a trace on a function
> that could display the return value of the function, for an arbitrary function.
> Having a return() statement makes this more difficult, since you
> cannot simply make a transformation from
> origFun <- function(...) body
> to
> newFun <- function(...) { retVal <- body ; print(retVal) ; retVal }
> I think you really have to make a new function that wraps the original one, like
> newFun <- function(...) { retVal <- origFun(...) ; print(retVal) ; retval }
> The latter will not work with functions that that use things like
> sys.parent() so you may have to go into the body of the code and patch
> those up.
>
> (My preferences are colored by my experience looking for problems in
> other people's code. My own code is always easy to understand but
> code other people write can be difficult. :-))
>
>
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
>
>
> On Sun, Jul 27, 2014 at 5:14 PM, Duncan Murdoch
> <murdoch.duncan at gmail.com> wrote:
>> On 27/07/2014, 7:29 PM, MacQueen, Don wrote:
>>> As long as people are sharing their preferences . . .
>>>
>>>
>>> I find return() useful in a scenario like the following:
>>>
>>> Myfun <- function() {
>>> {a few lines of code}
>>> if (condition) return(whatever)
>>> {Many, many lines of code}
>>> Results
>>> }
>>>
>>> Which I find preferable to
>>>
>>> Myfun <- function() {
>>> { a few lines of code}
>>> if (condition) {
>>> Results <- something
>>> } else {
>>> {Many, many lines of code}
>>> Results <- something.else
>>> }
>>> Results
>>> }
>>>
>>
>> I tend to agree with you, but wanted to point out a third possibility:
>>
>>
>> Myfun <- function() {
>> { a few lines of code}
>> if (condition) {
>> something
>> } else {
>> {Many, many lines of code}
>> something.else
>> }
>> }
>>
>> In some sense this is the most "R-like", but I like it the least.
>>
>> Duncan Murdoch
>>>
>>> It is the presence of those many lines of code which separate the opening
>>> and closing brackets after the else that make the former easier to read
>>> and understand (again in my opinion).
>>>
>>> I guess this is more along the lines of exception handling.
>>>
>>> Also note that this is something of a special case; I don¹t in general
>>> advocate using return().
>>>
>>
>> ______________________________________________
>> R-help at 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.
>
> ______________________________________________
> R-help at 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.
More information about the R-help
mailing list