[R] Linking to C type short?

Duncan Murdoch murdoch.duncan at gmail.com
Fri Jul 27 04:23:54 CEST 2012


On 12-07-26 9:06 PM, Spencer Graves wrote:
> On 7/26/2012 4:51 PM, Duncan Murdoch wrote:
>> On 12-07-26 4:22 PM, Spencer Graves wrote:
>>> Hello, All:
>>>
>>>
>>>          What references exist on how to link to C?
>>>
>>>
>>>          I'm familiar with sections 5.2 and 5.6 of the "Writing R
>>> Extension" manual plus chapter 6 of Venables and Ripley (2000) S
>>> Programming (Springer).  From these, I get the following:
>>>
>>>
>>> R storage mode   C type
>>> logical          int *
>>> integer          int *
>>> double           double *
>>> complex          Rcomplex *
>>> character        char **
>>> raw              unsigned char *
>>> list             SEXP *
>>> R object         SEXP
>>>
>>>
>>>          "integer" and "int" are 32 bits.  If I understand correctly,
>>> "short" has only 16 bits = 2 bytes.
>>
>> I imagine that depends on the platform and compiler.
>>
>>>
>>>
>>>          Should I define any "short" vector in C as a matrix with 2 rows
>>> of type either "raw" or "char"?
>>
>> What do you want to do with it in R?  If you want to use .C() and just
>> want it to be an opaque blob, then a raw vector is probably best.
>> Have one C function that figures out the size in bytes of the blob,
>> then allocate a raw vector of that size, and call a different function
>> to fill it in (or the same function with different arguments...). If
>> you actually want to work with the short values, then you'll need to
>> convert them to a type that R understands, most likely int (but double
>> would work too).
>
>
>         I have DICOM (.dcm) files from Computed Tomography (CT scans).
> It sounds like readDICOMFile{oro.dicom} should be able to read this.
> Unfortunately, it won't, because my particular DICOM files have images
> stored as lossless JPEG, which is not readable by the current version of
> oro.dicom.  I'm working to fix this deficiency with Brandon Whichter,
> project admin for oro.dicom and related packages.
>
>
>         An example of such an image file is available from the R-Forge
> version of oro.dicom:
>
>
> install.packages("oro.dicom", repos= c("http://R-Forge.R-project.org",
> getOption("repos")))
> library(oro.dicom)
> jpgIn.dcmFile <- system.file('jpeg/cervicalKyphosis.dcm',
>                               package='oro.dicom')
> str(dcm <- readDICOMFile(jpgIn.dcmFile))
>
>
>         dcm$hdr provides information needed to decode the data in the
> rest of the file, returned as dcm$img in this developmental version of
> oro.dicom.  Row 39 tells us the data type:
>
>
>   > dcm$hdr[39,]
>      group element                  name code length
> 39  0008    2111 DerivationDescription   ST     36
>                                     value sequence
> 39 2:1 JPEGLOSSLESSPROCFIRSTORDERREDICT
>
>
>         Brandon Whichter said that the information required to decode
> this type of dcm file is available in Kongji Huang and Brian Smith
> (1994) "Lossless JPEG Codec", v. 1.0 <URL:
> ftp://ftp.cs.cornell.edu/pub/multimed/ljpg.tar.Z>.  One way to use this
> might be to install this software so it is accessible from a commands
> prompt as "ljpgtopnm foo.ljpg foo.ppm", where "foo.ljpg" is an image
> file in lossless JPEG format and foo.ppm is a name for the desired
> decompressed output file.
>
>
>         However, rather than try to invoke a systems command from within
> R, I though it might be better to study the algorithm more carefully.
> This identified a function DecodeImage in C++ or C, which takes an
> argument of class DecompressInfo.  I thought I would try to create this
> DecompressInfo argument from the information available in dcm$hdr, then
> call DecodeImage (compiled C++ or C) from R.

There are a couple of functions called "read.jpeg" on CRAN.  I'd try 
them first rather than writing it myself.

>         I don't know if it's better to use .Call or .C.

.Call generally leads to more efficient code, but it requires you to 
know more about R internals.

Duncan Murdoch

>
>
>         Thanks,
>         Spencer
>
>>
>> If you want to use the .Call interface, there are some other choices,
>> e.g. external pointers.
>>
>> Duncan Murdoch
>>
>>>
>>>
>>>          Thanks,
>>>          Spencer
>>>
>>>
>>> p.s.  I need this to link to lossless JPEG code obtained from
>>> "ftp.cs.cornell.edu/pub/multimed/ljpg.tar.Z"
>>>



More information about the R-help mailing list