[R] Advice on good programming practice, lexical scope
Gabor Grothendieck
ggrothendieck at myway.com
Wed Sep 1 13:34:35 CEST 2004
Gabor Grothendieck <ggrothendieck <at> myway.com> writes:
:
: Sixten Borg <sb <at> ihe.se> writes:
:
: :
: : In "An Introduction to R" (See R help menu), there is an example of a
: function 'open.account' that makes use
: : of the lexical scope in R.
: :
: : I have a set of functions that can be used to output R tables and graphics
: into a single report document. (I am
: : aware that several tools can do this already).
: :
: : While reorganizing my code, I realize that I can collect my functions in a
: list, in the style of
: : 'open.account' above. This will result in a list containing data and
: operations on those data. The data is
: : for example the file name of the report. This also results in a rather
large
: object instead of a set of rather
: : small functions and a list of data.
: :
: : Writing a package of these functions (or this object containing
functions),
: would require documentation
: : of each function. The style that I see in the R help is that the functions
: are not enclosed like this in a list.
: :
: : I like the idea of having the functions collected in a single list, but I
: think the documentation might be
: : messy.
: : Any ideas, opinions, anyone?
: :
: : Thanks in advance,
: : Sixten.
: :
: : Example:
: :
: : myreport <- report(filename="report.rtf")
: : my.report$add.table(my.data.frame, "Table of ...")
: : plot(runif(10))
: : my.report$add.picture("Plot of ...")
: :
: : or...
: :
: : r <- report(filename="report.rtf")
: : r <- add.table(r, my.data.frame, "Table of...")
: : plot(runit(10))
: : r <- add.picture(r, "Plot of...")
:
: Can't say which is better but in terms of the S3 system style
: might look at the R2HTML package for an example.
: R2HTML defines a generic function, HTML, and then
: defines specific methods such as HTML.data.frame to produce HTML
: formatted data frames, HTML.list to produce HTML formatted lists, etc.
: The nice thing is that they can all be called in a uniform way using:
:
: HTML(x)
:
: and HTML will dispatch HTML.data.frame, HTML.list or whatever
: depending on the class of x. Thus you could have a generic
: add function
:
: add <- function(x, ...) UseMethod("add")
:
: and specific methods:
:
: add.data.frame <- function(x, ...) ...
: add.recordedplot <- function(x, ...) ...
:
: and call them all in a uniform way passing a data.frame or a
: display list of class recordedplot using the add call in each case
: but having add dispatch add.data.frame or add.recordedplot
: according to the class of the first arugment. In the following
: the first call to add actually invokes add.data.frame (which
: you would have previously defined) whereas the second call
: to add invokes previously defined add.recordedplot. The following
: assumes the plot device is already open:
:
: r <- report("filename")
: my.data.frame <- data.frame(a=1:26,b=letters)
: r <- add(r, my.data.frame)
: dev.control(displaylist="enable") # enable display list
: plot(1:10)
: my.plot <- recordPlot() # load displaylist into variable
: r <- add(r, my.plot)
Obviously the above code does not correspond to my discussion
which says that the dispatch occurs based on the FIRST argument to
add. These should have been:
r <- report("filename")
my.data.frame <- data.frame(a=1:26,b=letters)
r <- add(my.data.frame, r)
dev.control(displaylist="enable") # enable display list
plot(1:10)
my.plot <- recordPlot() # load displaylist into variable
r <- add(my.plot, r)
More information about the R-help
mailing list