An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20090420/0aeea31b/attachment-0001.pl>
Functions in lists or arrays?
2 messages · Toby, Bill Venables
t <- list() t[[1]] <- function(b) b*2 ### NOTE, [[ not [ t
[[1]] function (b) b * 2
Bill Venables http://www.cmis.csiro.au/bill.venables/ -----Original Message----- From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Toby Sent: Tuesday, 21 April 2009 3:51 PM To: r-help at r-project.org Subject: [R] Functions in lists or arrays? I have a problem where I need to have a "driver" style R program that will extend itself, given more 'source("extra.R")' style lines. IE: easy to modify by other people. The problem becomes when I would like to create an array or list of functions. Each function, possibly hundreds of them, are really created by other programs, generating an *.R file. So for example, if I try:
t <- list()
t[1] <- function(b) { b*2 }
Error in t[1] <- function(b) { :
cannot coerce type 'closure' to vector of type 'list'
Similar errors for arrays, and anything else I can think of. I'm an R
neophite, which likely shows. The
only way I seem to be able to do the above, is to generate unique names for
each function, and add
each name into a list, sort of like this:
# Register ourselves
models <- cbind(models, "Nasa_PART_Rules")
bounds <- cbind(bounds, "Nasa_PART_Bounds")
Nasa_PART_Rules <- NULL
Nasa_PART_Bounds <- NULL
# Rules section
Nasa_PART_Rules <- rbind(Nasa_PART_Rules, c("Nasa_PART_R1", "F"))
Nasa_PART_R1 <- function(f) {
f[,"CYCLOMATIC_COMPLEXITY"] > 8 &
f[,"CYCLOMATIC_COMPLEXITY"] <= 60 &
f[,"LOC_TOTAL"] > 73
}
Nasa_PART_Bounds <- rbind(Nasa_PART_Bounds, c("Nasa_PART_B1"))
Nasa_PART_B1 <- function(b) {
b["CYCLOMATIC_COMPLEXITY",0] <- 8
b["CYCLOMATIC_COMPLEXITY",1] <- 60
b["LOC_TOTAL",0] <- 73
}
#...
And then using something like this function:
# Dispatch a function from its name
dispatch <- function(f, x) {
eval(call(f, x))
}
to evaluate each rule over all the data rows:
# Read training+validation data
dat <- read.csv("jm1_data(training+validation).csv")
mat <- NULL
clt <- NULL
# Evaluate each rule against the dataset
for (i in models) {
# Get the rules for the model
rules <- eval(substitute(foo[,1], list(foo=as.name(i))))
cls <- eval(substitute(foo[,2], list(foo=as.name(i))))
res <- lapply(rules, dispatch, dat)
#...
Now, this seems way too uggly to me. Can someone give me a hand and/or
point me into a more sane
direction to explore?
One option I have thought of, is to get rid of the *_B?() functions and just
fill in a 3 dimensional array using
something like:
x <- NULL
dimnames(x) <- c(colnames(mat),colnames(dat), c("lbound","ubound"))
...
x["RULE_NAME_1", "DATA_COL_NAME_1", "lbound"] <- ...
...
But I'm not exactly sure how I would construct and/or add onto a global
array/etc extra dimnames, as I source
each generated *.R file.
Anyways, Not sure if I'm making much sense... thanks for any help,
-Toby.
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.