Hi Nathan, Perhaps if you defined your "length" object as "nbm" (number of binary messages), it would not interfere with the default "length".
Jim On Tue, Feb 2, 2016 at 12:46 AM, Georgi Boshnakov < georgi.boshna...@manchester.ac.uk> wrote: > Hi, > > >I have run into an issue while developing an R package. Specifically, my > issue relates to what happens when I define an S3 length > >method for my class. Here is my basic setup: > > ># Here is the structure of myClass > ># uses an externalptr to operate on file using some C functions list(file > = "my/file/location", handle = <externalptr>) > > ># this function gets an S3Method() in NAMESPACE length.myClass <- > function(x) { > > .Call("get_class_length",myPkg) > >} > > >As you can see, myClass is just a list of two pieces of information about > the particular object. Without a defined length method, length(myClass) > would be 2. However, I defined a length method to give me the information > about the amount of binary messages contained in the file the object points > to. In one of my test files there are 82 messages and length(myObject) > correctly returns 82. What I ran into is that I was crashing RStudio when > rebuilding my package with an object of myClass in my environment. Only > > removing my S3 length method caused the crash to not occur. After > looking for memory leaks and other errors I finally noticed that > the > str() on the object of myClass looked odd. It returned something like this: > > List of 82 > > $ file : chr "my/file/location" > > $ handle:<externalptr> > >$ NA: > >Error in object[[i]] : subscript out of bounds > > > You could define methods for indexing ("[" and "[[") for objects from your > class. > Since you have not defined special subsetting methods for your class, R > uses a default one, but honours your length(), hence the mess. > > Regards, > Georgi Boshnkaov > > > -----Original Message----- > From: R-package-devel [mailto:r-package-devel-boun...@r-project.org] On > Behalf Of Nathan Wendt > Sent: 30 January 2016 19:25 > To: r-package-devel@r-project.org > Subject: [R-pkg-devel] S3 length method behavior > > Hello, > > I have run into an issue while developing an R package. Specifically, my > issue relates to what happens when I define an S3 length method for my > class. Here is my basic setup: > > # Here is the structure of myClass > # uses an externalptr to operate on file using some C functions list(file > = "my/file/location", handle = <externalptr>) > > # this function gets an S3Method() in NAMESPACE length.myClass <- > function(x) { > .Call("get_class_length",myPkg) > } > > As you can see, myClass is just a list of two pieces of information about > the particular object. Without a defined length method, length(myClass) > would be 2. However, I defined a length method to give me the information > about the amount of binary messages contained in the file the object points > to. In one of my test files there are 82 messages and length(myObject) > correctly returns 82. What I ran into is that I was crashing RStudio when > rebuilding my package with an object of myClass in my environment. Only > removing my S3 length method caused the crash to not occur. After looking > for memory leaks and other errors I finally noticed that the str() on the > object of myClass looked odd. It returned something like this: > > List of 82 > $ file : chr "my/file/location" > $ handle:<externalptr> > $ NA: > Error in object[[i]] : subscript out of bounds > > It seems that when I define an S3 method for length that somehow the > object of myClass then gets restructured to have the length returned by the > function. There are 82 messages in the file, but myClass objects should > only have two elements. My best guess here is that the RStudio crash was > happening because the object was misrepresented internally. Of course, I > cannot be sure. None of my tests pointed to anything useful. > > My questions are, then, whether this behavior makes sense and what to do > about it. If I define my own str() method, will that fix it? I think I am > just misunderstanding what is going on with the methods I have defined. > Hopefully, someone can offer some clarity. > > Thanks, > > [[alternative HTML version deleted]] > > ______________________________________________ > R-package-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-package-devel > > ______________________________________________ > R-package-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-package-devel > [[alternative HTML version deleted]] ______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel