Hi Barry,

this actually a good idea, to put them together! Probably even creating an 
object containing both of them. Haven't thought about it before. 

Best
Simon
On Jan 31, 2013, at 3:49 PM, Barry Rowlingson <b.rowling...@lancaster.ac.uk> 
wrote:

> On Thu, Jan 31, 2013 at 11:52 AM, Simon Zehnder <szehn...@uni-bonn.de> wrote:
>> Dear R community,
>> 
>> I do know, that an R function is constructing a copy of any object passed as 
>> argument into a function. I program on a larger S4 project for a package, 
>> and I arrived at a point where I have to think a little harder on 
>> implementation style (especially to spare users complex object handling).
>> 
>> I have a function foo(), taking as input arguments two S4 objects of 
>> different class type
>> 
>> foo <- function(o1, o2) {
>>        o1@att1 <- producesomething()
>>        o2@att2 <- producesomethingelse()
>> 
>> }
>> 
>> Of course, this functions does not change the objects in the global 
>> environment. Now I have two choices
>> 
>> 1. Change the objects and return a list with both objects:
>> 
>>        foo <- function(o1, o2) {
>>                o1@att1 <- producesomething()
>>                o2@att2 <- producesomethingelse()
>> 
>>                l <- list(O1 = o1, O2 = o2)
>>                return(l)
>>        }
>> 
>> This is cumbersome for users, as they have then to assign the objects inside 
>> the returned list to the symbols used in the global environment. But it is 
>> the way intended by R.
> 
> By cumbersome you mean the following (anti-?) pattern has to be used,
> for example in a loop:
> 
> o1 = something()
> o2 = somethingelse()
> o12 = foo(o1,o2)
> o1 = o12$o1
> o2 = o12$o2
> 
> so that at the end of it you have a modified o1 and o2?
> 
> I suggest that if you have a function that modifies more than one of
> its arguments, then there is a strong case for making those arguments
> a single argument. So that you'd do:
> 
> foo = function(o12){
>    o12$o1@att=bar()
>    o12$o2@att=baz()
>    return(o12)
>  }
> 
> o12 = list(something(), somethingelse())
> o12 = foo(o12)
> 
> and there you are, a modified o12 object. no packing/unpacking needed.
> 
> I suspect that either your o1 and o2 are so closely related that you
> should pack them in a list (or ideally, an object) or differently
> related such that you should treat them separately and not tweak both
> of them within the same function. That approach is binding behaviour
> very tightly to two structures, and probably won't give you very
> debuggable modular code.
> 
> 
> B

______________________________________________
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.

Reply via email to