1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
###########################################################################/**
# @RdocClass RspShSourceCode
#
# @title "The RspShSourceCode class"
#
# \description{
# @classhierarchy
#
# An RspShSourceCode object is an @see "RspSourceCode" holding shell code.
# }
#
# @synopsis
#
# \arguments{
# \item{...}{@character strings.}
# }
#
# \section{Fields and Methods}{
# @allmethods
# }
#
# @author
#
# @keyword internal
#*/###########################################################################
setConstructorS3("RspShSourceCode", function(...) {
extend(RspSourceCode(...), "RspShSourceCode")
})
#########################################################################/**
# @RdocMethod evaluate
# @aliasmethod findProcessor
#
# @title "Evaluates the shell (sh) code"
#
# \description{
# @get "title".
# }
#
# @synopsis
#
# \arguments{
# \item{envir}{The @environment in which the RSP string is evaluated.}
# \item{args}{A named @list of arguments assigned to the environment
# in which the RSP string is parsed and evaluated.
# See @see "R.utils::cmdArgs".}
# \item{output}{A @character string specifying how the RSP output
# should be handled/returned.}
# \item{...}{Optional arguments passed to @see "base::eval".}
# }
#
# \value{
# If \code{output="stdout"}, then @NULL is returned and the RSP output
# is sent to the standard output.
# Note that this is output is "buffered", meaning it will be sent to
# standard output upon completion. This is a limitation of R.
# If \code{output="RspStringProduct"}, then the output is captured
# and returned as an @see "RspStringProduct" with attributes set.
# }
#
# @author
#
# \seealso{
# @seeclass
# }
#*/#########################################################################
setMethodS3("evaluate", "RspShSourceCode", function(object, envir=parent.frame(), args="*", output=c("RspStringProduct", "stdout"), ..., verbose=FALSE) {
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Local functions
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
evalSh <- function(text, ...) {
pathnameT <- tempfile(pattern="RSP-sh-", fileext=".sh")
writeLines(text, con=pathnameT)
on.exit({
file.remove(pathnameT)
})
res <- system2("sh", args=list(pathnameT), stdout=TRUE)
res <- paste(res, collapse="\n")
res
} # evalSh()
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Validate arguments
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Argument 'args':
args <- cmdArgs(args=args)
# Argument 'output':
output <- match.arg(output)
code <- object
# Assign arguments to the parse/evaluation environment
attachLocally(args, envir=envir)
# Evaluate R source code and capture output
res <- evalSh(code)
if (output == "RspStringProduct") {
res <- RspStringProduct(res, type=getType(object))
} else {
cat(res)
res <- NULL
}
res
}, createGeneric=FALSE) # evaluate()
setMethodS3("findProcessor", "RspShSourceCode", function(object, ...) {
function(...) {
evaluate(...)
}
}) # findProcess()
|