From jtk at cmp.uea.ac.uk  Fri Feb 11 13:27:39 2005
From: jtk at cmp.uea.ac.uk (Jan T. Kim)
Date: Fri Feb 11 12:30:36 2005
Subject: [Rd] Pipe / Fork: Partial Solution / Providing Connections from C?
In-Reply-To: <20050201195017.GC30798@jtkpc.cmp.uea.ac.uk>
References: <20050201135305.GA29528@jtkpc.cmp.uea.ac.uk>
	<Pine.LNX.4.61.0502011335290.15311@gannet.stats>
	<20050201195017.GC30798@jtkpc.cmp.uea.ac.uk>
Message-ID: <20050211122739.GA1442@jtkpc.cmp.uea.ac.uk>

Dear All,

On Tue, Feb 01, 2005 at 07:50:17PM +0000, Jan T. Kim wrote:
> On Tue, Feb 01, 2005 at 01:44:37PM +0000, Prof Brian Ripley wrote:

> > If we only had to consider standard Unices, pipe() would allow read-write 
> > modes.  As it is, it is easy for you to write an OS-specific extension.

I've looked into this and tried to write a function that would start
an external process and return two connections, one for writing to the
external process and one for reading from it. Unfortunately, I haven't
found a way to implement this in a package, without altering the R
source code itself (details below). As an alternative / workaround,
I coded up a function

   xpipe(cmd, input)

that takes a command to start the external process (cmd) and a character
containing the lines to be written (input), and returns a character
vector containing the output produced by the external process. The
xpipe package is available at

    http://www2.cmp.uea.ac.uk/~jtk/software/xpipe_0.0-1.tar.gz

To an extent, this provides the functionality I was looking for, but
it is not satisfactory because the output cannot be processed by R
on line -- xpipe accumulates the entire output and returns it only
after the external process has terminated.

Also technically, it's cumbersome to use: For obtaining something else
than a character value, it seems one has to write the output into an
anonymous file and then use scan, read.table or whatever to read from
that file.

Therefore, I still look for a way to implement the design where the
pipe ends are returned as R connections. The problem in doing so is that
connections are stored in a

    static Rconnection Connections[NCONNECTIONS];

(file src/main/connections.c), and I cannot find any function that
provides an interface for allocating a slot in the Connections array
and storing a connection set up by a the code in my package there.
There is a non-static (i.e. externally visible) NextConnection function
(which is not declared in any header, though), and nothing like

    Rboolean setConnection(int connNumber, Rconnection *conn);
    Rconnection *getConnection(int connNumber);

I haven't found any relevant documentation on these issues (R-exts
doesn't have any info on handling connections in C code at all). Can any
of you direct me to such docs, or point out how I can instantiate and
return connections from within a package?

> Well, that is probably reasonably easy, but (not the least due to that
> fact) I'm still surprised that it has not been done already. I can hardly
> imagine that I'm the first one to want to use some external utility from
> an R program in this way.
> 
> So, what do you R-devel folks do in this case, and what would you
> recommend?

I'm still curious about this one. If there really is no way of running
stuff through external filter processes in R, I'd volunteer to add
that.

Best regards & thanks in advance, Jan
-- 
 +- Jan T. Kim -------------------------------------------------------+
 |    *NEW*    email: jtk@cmp.uea.ac.uk                               |
 |    *NEW*    WWW:   http://www.cmp.uea.ac.uk/people/jtk             |
 *-----=<  hierarchical systems are for files, not for humans  >=-----*


[Rd] Pipe / Fork: Partial Solution / Providing Connections from C?
Jan T. Kim