OpasnetUtils/Update: Difference between revisions

From Opasnet
Jump to navigation Jump to search
(→‎Alternative: new version)
(code replaced with link to code)
 
Line 9: Line 9:


==Code==
==Code==
<rcode
name="setmethod.update"
label="Initiate functions"
graphics="1"
showcode="1"
>
# SETMETHOD UPDATE ########## update updates the output of an ovariable based on data and function.
####### The function assumes that object@data is always available, but object@dependencies may be empty.
temp <- setMethod(
f = "update",
signature = "ovariable",
definition = function(object) {
dat  <- data.frame(Source = "Data", interpret(object@data))
if(ncol(object@dependencies) == 0 & nrow(object@dependencies) == 0) {
object@output <- dat
} else {
form <- object@formula(object@dependencies)
if(is.vector(form)) {form <- data.frame(Result = form)}
if(class(form) == "ovariable") {form <- form@output}
form <- data.frame(Source = "Formula", form)
object@output <- orbind(dat, form)
}
colnames(object@output)[colnames(object@output) == "Source"] <- paste("Source", object@name, sep = ".")
object@marginal <- c(TRUE, object@marginal) # This alone is not enough; orbind must operate with marginals as well.
return(object)
}
)


 
https://www.opasnet.org/svn/opasnet_utils/trunk/R/Update.r
#### This code was taken out of update. It is still needed somewhere but not here.
# dep <- object@dependencies
# for(i in 1:length(dep)) {
# if(class(dep[[i]]) == "ovariable") {
# dep[[i]] <- dep[[i]]@output
# } else {
# if(length(grep("Op_(en|fi)", dep[[i]])) > 0) {
# dep[[i]] <- op_baseGetData("opasnet_base", dep[[i]])}
# else {
# if(class(dep[[i]]) != "data.frame" & !is.numeric(dep[[i]])) {
# dep[[i]] <- get(dep[[i]])
# }
# }
# }
# }
</rcode>
 
=== Alternative ===
{{comment|# |To be able to control, when variables are evaluated we need functions EvalOutput and CheckMargins. Which determine the values of the output and margin of an ovariable. |--[[User:Teemu R|Teemu R]] 13:06, 15 June 2012 (EEST)}}
 
<rcode
name="setmethod.update"
label="Initiate functions"
graphics="1"
showcode="1"
>
# EvalOutput #################### evaluates the output slot of ovariables
##### Marginals should be also checked and updated here or elsewhere
 
EvalOutput <- function(variable, ...) { # ... for e.g na.rm
if (nrow(variable@data) > 0) {
rescol <- ifelse(
"Result" %in% colnames(variable@data),
"Result",
paste(variable@name, "Result", sep = ":")
)
if (!is.numeric(variable@data[[rescol]])) {
a <- interpret(variable@data, rescol = rescol, ...)
} else a <- variable@data
} else a <- variable@data
b <- variable@formula(variable@dependencies)
if (is.numeric(b) & nrow(variable@data) == 0) {
stop(paste("No proper data nor formula defined for ", variable@name, "!\n", sep = ""))
}
if (is.numeric(b)) {
a[,paste(variable@name, "Source", sep = ":")] <- "Data"
variable@output <- a
return(variable)
}
if (nrow(variable@data) == 0) {
b[,paste(variable@name, "Source", sep = ":")] <- "Formula"
variable@output <- b
return(variable)
}
colnames(a)[colnames(a) == rescol] <- "FromData"
colnames(b)[colnames(b) %in% c(paste(variable@name, "Result", sep = ":"), "Result")] <- "FromFormula" # *
# <variablename>: prefix not necessitated for "Result" column of formula output
temp <- melt(
merge(a, b, all = TRUE, ...), # Will cause problems if dependencies contain non-marginal indices that match with -
# marginal indeces in data. Or maybe not.
measure.vars = c("FromData", "FromFormula"),
variable.name = paste(variable@name, "Source", sep = ":"),
value.name = paste(variable@name, "Result", sep = ":"),
...
)
levels(
temp[[paste(variable@name, "Source", sep = ":")]]
) <- gsub("^From", "",
levels(
temp[[paste(variable@name, "Source", sep = ":")]]
)
)
variable@output <- temp
return(variable)
}
</rcode>


==See also==
==See also==

Latest revision as of 14:04, 16 August 2012



Description

Updates the output of an ovariable based on data and function. The function assumes that object@data is always available, but object@dependencies may be empty.

Code

https://www.opasnet.org/svn/opasnet_utils/trunk/R/Update.r

See also