On 7/13/10 8:43 AM, Daniel Murphy wrote:
Thank you. For "getDataPart" I was following (my interpretation of)
advice from the documentation for "Classes": The functions |getDataPart
<http://127.0.0.1:15455/library/methods/help/getDataPart>| and
|setDataPart <http://127.0.0.1:15455/library/methods/help/setDataPart>|
are a cleaner, but essentially equivalent way to deal with the data part.
I interpreted "cleaner" to mean "preferred." From your reply, John, it
sounds like I should go back to the obj...@.data construct.

No, that's not the distinction. Preferred for what, is the question. In order for a class to extend a basic type, it has to have that type. Then the .Data "slot" is a sort of fiction needed for the metadata. (Because of some "features" of R implementation, it's not quite that simple. Matrices act like a basic type, and some types, such as "environment" require a second kludge.)


If you really want that slot, the advice holds, but only because there is no actual ".Data" slot (i.e., attribute).

But you weren't talking about that at all. In fact (just to contradict my previous mail) you probably wanted to turn your object into a data.frame. If so, best to say so:

> as(z, "data.frame")
Object of class "data.frame"
  x
1 1
2 2
3 3

and, for that matter:

> as(z, "list")
[[1]]
[1] 1 2 3

-Dan
On Tue, Jul 13, 2010 at 5:57 AM, John Chambers <j...@r-project.org
<mailto:j...@r-project.org>> wrote:

    On 7/11/10 9:08 PM, Daniel Murphy wrote:

        R-Devel:

        When I get the data part of an S4 class that
        contains="data.frame", it gives
        me a list, even when the "data.frame" is the S4 version:

            d<-data.frame(x=1:3)
            isS4(d)

        [1] FALSE                           # of course

            dS4<-new("data.frame",d)
            isS4(dS4)

        [1] TRUE                            # ok

            class(dS4)

        [1] "data.frame"                   # good
        attr(,"package")
        [1] "methods"

            setClass("A", representation(label="character"),
            contains="data.frame")

        [1] "A"

            a<-new("A",dS4, label="myFrame")
            getDataPart(a)

        [[1]]                                  # oh?
        [1] 1 2 3

            class(a...@.data)

        [1] "list"                           # hmm

            names(a)

        [1] "x"                             # sure, that makes sense

            a

        Object of class "A"
           x
        1 1
        2 2
        3 3
        Slot "label":
        [1] "myFrame"


        Was I wrong to have expected the "data part" of 'a' to be a
        "data.frame"?


    Yes.  Also, there is a clue in the documentation for getDataPart:
    "rarely suitable to be called directly"
    The data part, aka "data slot", generally does not have a class (S4
    or S3).

    You are probably looking for S3Part():

     > setClass("myFrame", contains = "data.frame")
    [1] "myFrame"
     > z = new("myFrame", data.frame(x=1:3))
     > z
    Object of class "myFrame"

      x
    1 1
    2 2
    3 3
     > S3Part(z)
    Object of class "data.frame"

      x
    1 1
    2 2
    3 3
     > S3Part(z, strictS3 = TRUE)

      x
    1 1
    2 2
    3 3




        Thanks.

        Dan Murphy

                [[alternative HTML version deleted]]

        ______________________________________________
        R-devel@r-project.org <mailto:R-devel@r-project.org> mailing list
        https://stat.ethz.ch/mailman/listinfo/r-devel



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

Reply via email to