redExec: execute REDUCE commands from R

View source: R/redcas.R

redExecR Documentation

execute REDUCE commands from R

Description

sends a vector of commands to the REDUCE process for execution and retrieves and formats the output.

Usage

redExec(id, x, split = TRUE, drop.blank.lines = FALSE, notify=0, timeout=0)

Arguments

id

session identification returned by redStart. Required.

x

A character vector contain either the REDUCE commands to execute, the names of REDUCE command files or a mixture of both. Required.

split

Logical. Should the output be split into separate vectors for echoed commands and for output. Default TRUE.

drop.blank.lines

Logical. Should blank lines be removed from the output? Default FALSE.

notify

while waiting for the REDUCE commands to complete, write a note to the console every ⁠notify⁠ seconds. Default is zero which suppresses the message.

timeout

numer of seconds after which to terminate the function if it is still waiting for output from the REDUCE process. Default is 0 which will never initiate termination.

Details

Before submitting the vector x, redExec modifies it as follows:

  • inserts a ";" terminator at the start of x. This is required to ensure that the first command in the next submit block has a number. Numbers are required to distinguish commands from command output;

  • replaces any file names in x with their contents. This means that the contents of the files are executed directly and not via an IN or IN_TEX command. Files are specified by preceding the filename with file:. A terminator is not required and, if present, is ignored;

  • appends a command to x in order to set an end of block marker. This is required so that redExec can wait until all the commands submitted have been executed. This is especially important for commands which run for a long time.

When reading the output from the submitted commands, redExec removes the end of block command and the marker it sets.

Care must be taken when using the drop.blank.lines option. In particular, if using the REDUCE NAT switch, which is the default, and output is not formatted for LaTeX, it may be difficult to read the output.

If REDUCE prompts for input during a sumbit block, redExec will write an informative message, return the output and close the session, writing the log to the current directory. This most likely happens if you use a variable as an operator but did not declare it as such. One way to avoid this is to turn off the switch INT which causes REDUCE to declare any undeclared operators it encounters. If you do this, be sure to turn on INT before you call redClose as otherwise the REDUCE session will hang. You should use the code on int;;. Note that both semicolons are required. Since REDUCE is run via a pipe, INT is on by default.

If the last statement (element of x) is missing a terminator (semi-colon or dollar sign) redExec checks whether the last non-blank, non-comment element of the input vector has a terminator. If not it stops with an appropriate message and returns FALSE. This reduces the likelihood that redExec fails to return.

Value

Like R, the REDUCE log contains both commands and outputs. If split is TRUE a list containing the following elements is returned:

out

the output of the executed commands;

cmd

the executed commands

raw

the interspersed commands and output.

If split is FALSE, redExec returns a character vector with the output from the REDUCE commands.

Author(s)

Martin Gregory

See Also

redStart for starting a REDUCE session, redSplitOut and redDropOut for post-processing the output if the split or drop.blank.lines are not used.

Examples

s1 <- redStart()

## can only run code if session was successfully started
if (is.numeric(s1)) {
   ## submit with neither split nor drop.blank.lines
   x1 <- c("solve((x+1)^2, x);",
	   "b:=factorize(45056);",
	   "operator v; ",
	   "la:=-m/(v(2)^2 + v(3)^2)^(1/2) ;")
   writeLines("## submit with neither split nor drop.blank.lines")
   writeLines(y1 <- redExec(s1, x1, split=FALSE))

   ## submit with split=TRUE and drop.blank.lines=TRUE
   writeLines("\n## submit with split=TRUE and drop.blank.lines=TRUE")
   writeLines(redExec(s1, x1, drop.blank.lines=TRUE)[["out"]])

   ## submit with file name in input
   tfile <- tempfile('reduce')
   writeLines(c(paste0('write "code from ', tfile, '";'),
		"b:=factorize(54056);"),
	      tfile)
   x3 <- c("la:=-m/(v(2)^2 + v(3)^2)^(1/2) ;",
	   paste0("file:",tfile))
   y3 <- redExec(s1, x3, split=TRUE)
   writeLines("\n## submit with file name in input")
   writeLines("## commands")
   writeLines(y3$cmd)
   writeLines("\n## output")
   writeLines(y3$out)
   redClose(s1)
}

redcas documentation built on April 12, 2025, 1:40 a.m.