Re: [Rd] .Call - applying setAttrib(x, R_DimSymbol, s) to a matrix being an element of a list

From: Simon Urbanek <simon.urbanek_at_r-project.org>
Date: Thu 17 Mar 2005 - 14:06:22 GMT

Oleg,

On Mar 16, 2005, at 8:34 PM, Oleg Sklyar wrote:

> Sorry, it is always a tradeoff - either to explain or put a
> relatively large code,

Just posting all R related commands is sufficient ;) - in your case that would be the single imgSize alloc and the assignments- but the full code is fine, too.

> which also uses non-standard libraries making the code difficult to
> read. imgSize values are reset in between: see the full code below.
> The SEXP pointer imgSize stays in tact,

That's the problem. As I said previously - you need to duplicate it or alloc new ones. setAttrib of non-NAMED values doesn't copy the value, so you're passing the same pointer to all your matrices, so they all share the same dimension object. This means that whenever you change integers the pointer is pointing at, you change it for all matrices you used it in, which is probably not what you intended.

> that's true, but its values are changed (the problem is, they are
> always the last in the row). I.e. if I have 3 images 40x20, 200x100
> and 150x75 I will get three matrices of 150x75, but if I omit
> setAtrib and return vectors I get vectors of different length.

The length of the vector has nothing to do with the dimensions - technically. In C you can say "this is a vector of 10 integers and has dimension 100x200" - although such matrix is invalid, in C you're free to do so. It's up to your code to make sure the dimension and the vector length match. In your case, they don't and your code is to blame ;).

Cheers,
Simon



R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Fri Mar 18 01:14:44 2005

This archive was generated by hypermail 2.1.8 : Mon 24 Oct 2005 - 22:26:30 GMT