Simon Urbanek wrote:

On Jan 30, 2009, at 10:30 , Christian Brechbühler wrote:

On Thu, Jan 29, 2009 at 4:44 PM, Prof Brian Ripley <rip...@stats.ox.ac.uk>wrote:

What did your actual application do? This seems a very strange thing to
do, and the segfault is in trying to construct the traceback.

Only by using do.call on the object (and not even by name) do I get this
error.  E.g.

`[.data.frame`(1:10, 3)

Error in NextMethod("[") : object not specified

do.call("[.data.frame", list(1:10, 3))

Error in NextMethod("[") : object not specified

are fine.

Obviously it would be nice to fix this, but I'd like to understand the
actual circumstances: there is more to it than the subject line.


Yes, there is more. For reporting the problem, we tried to pare it down to
a concise, self-contained test case.

My boss was debugging an issue in our R code.  We have our own "[...."
functions, because stock R drops names when subscripting.

... if you tell it to do so, yes. If you tell it to not do that, it won't ... ever tried drop=FALSE ?
The common situation I have (which might be the same as the OP's) is wanting to get a vector from a data frame, and having the rownames of the dataframe become the names on the vector.

With matrix, the behavior I want is the default behavior, e.g.,
> x <- cbind(a=c(x=1,y=2,z=3),b=4:6)
> x
 a b
x 1 4
y 2 5
z 3 6
> x[,1]
x y z
1 2 3

But with a data frame, subscripting returns a vector with no names:
> xd <- as.data.frame(x)
> xd[,1]
[1] 1 2 3

One can use drop=FALSE, but then you've still got a data frame, not a vector:
> (xd1 <- xd[,1,drop=FALSE])
 a
x 1
y 2
z 3

The simplest way I know to get a named vector is to use as.matrix on the one-column dataframe:
> as.matrix(xd1)[,1]
x y z
1 2 3
>
(Which works fine except in the case where xd1 has only one row...)

And BTW, am I missing something, or does the behavior of drop() not conform to the description in ?drop:
> Value:
>     If 'x' is an object with a 'dim' attribute (e.g., a matrix or
>     'array'), then 'drop' returns an object like 'x', but with any
>     extents of length one removed.  Any accompanying 'dimnames'
>     attribute is adjusted and returned with 'x': if the result is a
>     vector the 'names' are taken from the 'dimnames' (if any).  If the
>     result is a length-one vector, the names are taken from the first
>     dimension with a dimname.

How is this last sentence consistent with the following behavior?
> dimnames(x[1,1,drop=F])
[[1]]
[1] "x"

[[2]]
[1] "a"

> drop(x[1,1,drop=F])
[1] 1
>
From the description in "Value:" in ?drop, I would have expected above result to have the name "x" (the name from the first dimension with a dimname).

> sessionInfo()
R version 2.8.1 (2008-12-22)
i386-pc-mingw32

locale:
LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252

attached base packages:
[1] stats graphics grDevices utils datasets methods base >

-- Tony Plate

Cheers,
S


To bypass our
now-suspect functions and get the "real" subscripting method, he used "get" from package:base. He was examining a large object, and believing it was a data frame, chose "[.data.frame". As it turns out, that object was not a
data frame, and he got an unexpected segfault.  I think it was a matrix.
But it doesn't matter -- a vector as in the test case will give the same.

We have since fixed the bug in our replacement subscripting function, so the
issue might not affect us any more.

Thanks,
/Christian


On Thu, 29 Jan 2009, brechbueh...@gmail.com wrote:

Full_Name: Christian Brechbuehler
Version: 2.7.2, 2.8.1
OS: linux-gnu

If we mistakenly believe the object is a data frame (as we did in a much
more
complicated real situation), this happens:

do.call(get("[.data.frame",pos="package:base"),list(1:10,3))
Error in NextMethod("[") :
  no calling generic was found: was a method called directly?

 *** caught segfault ***
address (nil), cause 'unknown'

Process R:2 segmentation fault (core dumped) at Thu Jan 29 09:26:29 2009

The Error message is appropriate.  But the segmentation fault is
unexpected.



    [[alternative HTML version deleted]]

______________________________________________
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


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

Reply via email to