From tplate at acm.org  Fri Apr 27 17:08:21 2007
From: tplate at acm.org (Tony Plate)
Date: Fri, 27 Apr 2007 09:08:21 -0600
Subject: [Rd] system() in packages
In-Reply-To: <Pine.LNX.4.64.0704271517120.29708@gannet.stats.ox.ac.uk>
References: <3E7A71D7-49A5-4C2E-A365-9D2387D76D3B@soc.soton.ac.uk>
	<Pine.LNX.4.64.0704271517120.29708@gannet.stats.ox.ac.uk>
Message-ID: <463211E5.6030208@acm.org>

With cygwin bash installed under Windows, one can use pipes in system(), 
e.g., like this:

R 2.5.0 under Windows XP:
 > system("echo foo | sed s/foo/bar/") # this doesn't work under windows
foo | sed s/foo/bar/
 > # but using 'bash -c' does:
 > system("bash -c \"echo foo | sed s/foo/bar/\"")
bar
 > # and some use of quotes within the command actually works!
 > system("bash -c \"echo foo | sed 's/foo/bar rrr/'\"")
bar rrr
 >

[Beware: complex quoting inside the -c command can be difficult to get 
right.]

-- Tony Plate


Prof Brian Ripley wrote:
> The first comment is that will only work on Unix-alikes, since '|' needs a 
> shell.
> 
> So, if this is on a Unix-alike you need to establish if the program is in 
> the path at run time and cache the result.  I have no idea if this would 
> actually work, but for example system('gp --version') might provide a 
> suitable test.
> 
> On Fri, 27 Apr 2007, Robin Hankin wrote:
> 
>> Hello
>>
>> Quite often I need higher precision, or larger numbers,
>>  than IEEE double precision allows.  One strategy I sometimes
>> use is to use system() to call pari/gp, which is not constrained by
>> IEEE.
>>
>> [pari/gp is a GPL high-level mathematical programming language
>> geared towards pure mathematics]
>>
>> Two of my packages contain lines like the following:
>>
>>> system(" echo '1.12^66' | gp -q f",intern=TRUE)
>> [1]
>> "1771.697189476241729649767636564084681203806302318041262248838950177194
>> 116346432205160921568393661760"
>>
>> Note the high precision of the answer.
>>
>> My question is, how to deal with the possibility that pari/gp is not
>> installed?
>>
>> If the system cannot find gp for some reason, I get:
>>
>>> system(" echo '1.12^66' | gp -q f",intern=TRUE)
>> sh: line 1: gp: command not found
>> character(0)
>> What's the recommended way to handle this eventuality gracefully?  The
>> functions that do use pari/gp have "pure" R equivalents (but much
>> slower and less accurate)  so I want users to be able to install the
>> package without pari/gp.
>>
>>
>> --
>> Robin Hankin
>> Uncertainty Analyst
>> National Oceanography Centre, Southampton
>> European Way, Southampton SO14 3ZH, UK
>>  tel  023-8059-7743
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>



[Rd] system() in packages
Tony Plate