[R] R6 object that is a list of referenced object
Eric Berger
ericjberger at gmail.com
Thu Nov 16 11:03:13 CET 2017
Hi Cristina,
You can try this:
> Community <- R6Class("Community",
public = list(
e = NULL,
initialize = function() { self$e <- list() },
add = function( person ) { self$e[[ length(self$e)
+ 1]] <<- person }
)
)
> crowd <- Community$new()
> crowd$add(Person1)
> crowd$add(Person2)
> crowd$e
HTH,
Eric
On Thu, Nov 16, 2017 at 9:55 AM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us>
wrote:
> See below.
>
> On Wed, 15 Nov 2017, Cristina Pascual wrote:
>
> Dear community,
>>
>> I am having a class, let's say Person,
>>
>> Person <- R6Class("Person",
>> public = list(
>> idPerson = NULL,
>> name = NULL,
>> age = NULL,
>> initialize = function(idPerson = NA, name = NA, age
>> = NA) {
>>
>
> It is a bad idea to setup default values for all your parameters in any
> function, but particularly so for an initialization function. A Person with
> NA in the idPerson field is essentially unusable, so encouraging the
> creation of such an object is very bad practice.
>
> self$idPerson <- idPerson
>> self$name <- name
>> self$age <- age
>> }
>> ) # public
>>
>> ) # Person
>>
>> I have created:
>> Person1 <- Person$new(1,'a',4)
>> Person2 <- Person$new(2,'b',5)
>>
>> and I also have a class Community:
>>
>> Community <- R6Class("Community",
>> public = list(
>> e = NULL,
>> initialize = function() self$e <- Person$new()
>>
>
> Initializing a Community with a bogus person is as bad as the idPerson
> being NA. It makes a lot more sense to have the set of persons in a
> community be the null set than to have a minimum of one person in the
> community who happens to have invalid identification.
>
> )
>> )
>>
>> I want to create
>>
>> Community1 = List<Person>
>>
>> and add Person1 and Person2 to Community1 (Community1 <-
>> Community1$add(Person1)
>>
>> Community1 <- Community1$add(Person2)
>>
>> ????)
>>
>> How can I write this with R6? I cannot find the proper example in the
>> website.
>>
>> Can anybody help me?
>>
>> Thanks in advance,
>>
>
> You don't seem to be very familiar with either R or conventional
> object-oriented design. Although I am giving you a reprex below, I
> recommend that you avoid R6 until you are more familiar with how normal
> functional programming and S3 object oriented coding styles work in R.
> Using R6 as a crutch to avoid that learning process will only lead you to
> frustration and inefficient data handling. That is, this whole thing should
> just be a data frame.
>
> ########################################
> library(R6)
> Person <- R6Class( "Person"
> , public = list( idPerson = NA
> , name = NA
> , age = NA
> , initialize = function( idPerson
>
> , name
>
> , age
>
> ) {
>
> self$idPerson <- idPerson
>
> self$name <- name
>
> self$age <- age
>
> }
> ) # public
> ) # Person
>
> Person1 <- Person$new( 1, 'a', 4 )
> Person2 <- Person$new( 2, 'b', 5 )
>
> Community <- R6Class( "Community"
> , public = list( e = NULL
>
> , addPerson = function( p ) {
>
> self$e <- append( self$e, p )
>
> }
>
> )
> )
>
> Community1 <- Community$new()
> Community1$addPerson( Person1 )
> Community1$addPerson( Person2 )
> Community1$e
> #> [[1]]
> #> <Person>
> #> Public:
> #> age: 4
> #> clone: function (deep = FALSE)
> #> idPerson: 1
> #> initialize: function (idPerson, name, age)
> #> name: a
> #>
> #> [[2]]
> #> <Person>
> #> Public:
> #> age: 5
> #> clone: function (deep = FALSE)
> #> idPerson: 2
> #> initialize: function (idPerson, name, age)
> #> name: b
>
> # Standard R approach:
> Person1a <- data.frame( idPerson = 1
> , name = "a"
> , age = 4
> , stringsAsFactors = FALSE
> )
> Person2a <- data.frame( idPerson = 2
> , name = "b"
> , age = 5
> , stringsAsFactors = FALSE
> )
> Community1a <- rbind( Person1a, Person2a )
> Community1a
> #> idPerson name age
> #> 1 1 a 4
> #> 2 2 b 5
> ########################################
>
>
>>
>>
>> [[alternative HTML version deleted]]
>>
>
> Please POST IN PLAIN TEXT FORMAT. This is a setting you must make in your
> email program, and failure to do so will lead to us seeing different things
> than you send (that is, we see varying degrees of scrambling of your
> message if you send HTML-formatted emails). Read the Posting Guide
> mentioned below for more success tips.
>
>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posti
>> ng-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
> ------------------------------------------------------------
> ---------------
> Jeff Newmiller The ..... ..... Go Live...
> DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live
> Go...
> Live: OO#.. Dead: OO#.. Playing
> Research Engineer (Solar/Batteries O.O#. #.O#. with
> /Software/Embedded Controllers) .OO#. .OO#. rocks...1k
>
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posti
> ng-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
[[alternative HTML version deleted]]
More information about the R-help
mailing list