Re: [Rd] Extract method for a new class

2008-09-22 Thread Sklyar, Oleg (London)
You will need to define several for different combinations of i and j
types e.g. ANY,missing; ANY,ANY; missing,ANY or possibly for types like
integer, character and logical more or less in the following way:

setMethod([, signature(x=haplogList, i=ANY,j=ANY),
function(x, i, j, ..., drop=TRUE) {
## do whatever you want here; your class is not derived
from a list
## so we cannot use NextMethod
}
)

Dr Oleg Sklyar
Research Technologist
AHL / Man Investments Ltd
+44 (0)20 7144 3107
[EMAIL PROTECTED] 

 -Original Message-
 From: [EMAIL PROTECTED] 
 [mailto:[EMAIL PROTECTED] On Behalf Of Coster, Albart
 Sent: 19 September 2008 16:00
 To: r-devel@r-project.org
 Subject: [Rd] Extract method for a new class
 
 Dear list,
 
 I am trying to write a package for simulating meioses in R. 
 We defined a class 'haplotype' which contains the basic units 
 of our simulation:
 
 setClass(haplotype,representation(snp = numeric,qtl = list,
 hID = numeric,phID0 = 
 numeric,phID1 = numeric),
 prototype = list(hID = 
 0,phID0 = NaN,phID1 = NaN))
 
 In addition, we define a class 'haploList', which is just a 
 list of haplotypes:
 
 setClass(haploList,contains = list,representation(genDist 
 = numeric,roundDec = integer))
 
 Most things work fine, but when subsetting a haploList object 
 an object of class list is returned. I realize that I need to 
 write a function for subsetting this new object, and tried to 
 find the code for '[.listof' or something similar could not 
 find it, probably due to a suboptimal understanding of how it 
 is organized. 
 
 My question is, how could I define a extraction function for 
 my new class that uses all the existing functionality of the 
 Extract function for list? 
 
 Thanks in advance,
 
 Albart Coster
 


**
The contents of this email are for the named addressee(s...{{dropped:22}}

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Extract method for a new class

2008-09-19 Thread Martin Morgan
Coster, Albart [EMAIL PROTECTED] writes:

 Dear list,

 I am trying to write a package for simulating meioses in R. We defined
 a class 'haplotype' which contains the basic units of our simulation:

 setClass(haplotype,representation(snp = numeric,qtl = list, hID
 = numeric,phID0 = numeric,phID1 = numeric), prototype = list(hID
 = 0,phID0 = NaN,phID1 = NaN))

 In addition, we define a class 'haploList', which is just a list of
 haplotypes:

 setClass(haploList,contains = list,representation(genDist =
 numeric,roundDec = integer))

 Most things work fine, but when subsetting a haploList object an
 object of class list is returned. I realize that I need to write a
 function for subsetting this new object, and tried to find the code
 for '[.listof' or something similar could not find it, probably due to
 a suboptimal understanding of how it is organized.

 My question is, how could I define a extraction function for my new
 class that uses all the existing functionality of the Extract function
 for list?

You can find out what the generic looks like

 getGeneric([)
standardGeneric for [ defined from package base

function (x, i, j, ..., drop = TRUE) 
standardGeneric([, .Primitive([))
environment: 0xfc17a8
Methods may be defined for arguments: x, i, j, drop
Use  showMethods([)  for currently available ones.

and then write method(s) for your class:

setMethod([,
  signature=signature(x=haploList, i=ANY, j=missing),
  function(x, i, j, ..., drop=TRUE) {
  ## update and return x
  [EMAIL PROTECTED] - [EMAIL PROTECTED], drop=drop]
  x
  })

Note though that extending 'list' has hazards, e.g.,

 hlst - new(haploList, list(a=1,b=2))
 names(hlst)
[1] a b
 names(hlst[2])
[1] a

where the names have been confused! You'll want to manage the names
yourself (as a separate slot) or make sure that they're removed
entirely when you create / update your object.

(Here's a variant that I like

setMethod([,
  signature=signature(x=haploList, i=ANY, j=missing),
  function(x, i, j, ..., drop=TRUE) {
  ## feed updated values to 'initialize'
  initialize(x, [EMAIL PROTECTED])
  })

because the initialize call will [provided any initialize methods
defined on contained classes don't interfer] minimize copying. You'll
also likely want methods for $ and [[, and assignment methods [-
etc.)
  
Hope that helps,

Martin

 Thanks in advance,

 Albart Coster __
 R-devel@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M2 B169
Phone: (206) 667-2793

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel