|
|
Line 12: |
Line 12: |
| * fromunit = a character vector or factor with the current units | | * fromunit = a character vector or factor with the current units |
| | | |
− | ==Code== | + | ==Code= |
− | <rcode
| |
− | name="convert.units"
| |
− | label="Initiate functions"
| |
− | graphics="1"
| |
− | showcode="1"
| |
− | >
| |
− | # SETMETHOD CONVERT.UNITS####################################################3
| |
− | ############# convert.units: a function that converts units from one to another, if possible.
| |
− | # x = a numeric vector with values to be converted
| |
− | # tounit = a character vector of the new units to be used. Must be found from the To column from the table in [[Unit conversions]].
| |
− | # fromunit = a character vector or factor with the current units
| |
− | convert.units <- function(x, tounit = c("kg", "s", "m", "m3", "J", "W", "A", "V", "C", "N", "Pa", "Hz", "mol"), fromunit = NULL) {
| |
− | if(is.null(tounit)) {tounit <- c("kg", "s", "m", "m3", "J", "W", "A", "V", "C", "N", "Pa", "Hz", "mol")}
| |
− | if(is.null(fromunit)) { # Do nothing if from-units are not defined.
| |
− | out <- data.frame(Unit = fromunit, Result = x)
| |
− | } else {
| |
− | conversions <- fetch("Op_en5475") # Set up a full unit conversion table.
| |
− | conversions$Result <- as.numeric(conversions$Result)
| |
− | colnames(conversions)[colnames(conversions) == "type"] <- "Type"
| |
− | prefixes <- conversions[conversions$Type == "Prefix", ] # Combine all prefixes with all units in From column.
| |
− | colnames(prefixes) <- paste("Prefix.", colnames(prefixes), sep = "")
| |
− | conversions <- merge(prefixes, conversions[conversions$Type == "Unit", ])
| |
− | conversions$From <- paste(conversions$Prefix.From, conversions$From, sep = "")
| |
− | conversions$Result <- conversions$Result * conversions$Prefix.Result
| |
− | conversions <- conversions[c("From", "To", "Result")]
| |
− | conversions <- merge(conversions, conversions, by = "To") # Create all possible from-to pairs.
| |
− | conversions$Result <- conversions$Result.x / conversions$Result.y
| |
− | conversions <- unique(conversions[c("From.x", "From.y", "Result")])
| |
− | colnames(conversions) <- c("From", "To", "Result")
| |
− | coefficients <- data.frame()
| |
− | for(i in levels(as.factor(fromunit))) { # Look through each different "From" unit in the data.
| |
− | coefficient <- 1
| |
− | outto <- ""
| |
− | for(j in strsplit(i, split = " ")[[1]]) { # Look though each part of a composite unit.
| |
− | if(gsub("^/", "", j) != j) { # If unit is in denominator, use inverse.
| |
− | j <- gsub("^/", "", j)
| |
− | exponent <- -1
| |
− | slash <- "/"
| |
− | } else {
| |
− | exponent <- 1
| |
− | slash <- ""
| |
− | }
| |
− | conversions.j <- merge(conversions, j, by.x = "From", by.y = "y")
| |
− | conversions.j <- conversions.j[conversions.j$To %in% tounit, ]
| |
− | if(nrow(conversions.j) > 0) {
| |
− | coefficient <- coefficient * conversions.j$Result^exponent
| |
− | outto <- paste(outto, " ", slash, conversions.j$To, sep = "")
| |
− | }
| |
− | }
| |
− | coefficients <- rbind(coefficients, data.frame(
| |
− | From = i,
| |
− | To = gsub("^ ", "", outto),
| |
− | Result = coefficient
| |
− | ))
| |
− | }
| |
− | # Combine coefficients with data.
| |
− | out <- merge(fromunit, coefficients, by.x = "x", by.y = "From", sort = FALSE)
| |
− | out <- data.frame(Unit = out$To, Result = x * out$Result)
| |
− | }
| |
− | return(out)
| |
− | }
| |
| | | |
− | temp <- setGeneric("convert.units")
| + | =https://www.opasnet.org/svn/opasnet_utils/trunk/R/ConvertUnits.r |
− | | |
− | temp <- setMethod(
| |
− | f = "convert.units",
| |
− | signature = signature(x = "ovariable"),
| |
− | definition = function(x, tounit)
| |
− | {
| |
− | if("Unit" %in% colnames(x@output) & !is.null(tounit)) {
| |
− | x@output[c("Unit", "Result")] <- convert.units(x = x@output$Result, tounit = tounit, fromunit = x@output$Unit, expo = expo)
| |
− | }
| |
− | return(x)
| |
− | }
| |
− | )
| |
− | | |
− | temp <- setMethod(
| |
− | f = "convert.units",
| |
− | signature = signature(x = "data.frame"),
| |
− | definition = function(x, tounit = NULL)
| |
− | {
| |
− | if("Unit" %in% colnames(x) & "Result" %in% colnames(x) & !is.null(tounit)) {
| |
− | x[c("Unit", "Result")] <- convert.units(x = x$Result, tounit = tounit, fromunit = x$Unit, expo = expo)
| |
− | }
| |
− | return(x)
| |
− | }
| |
− | )
| |
− | | |
− | </rcode>
| |
| | | |
| ==See also== | | ==See also== |
A function that converts units from one to another, if possible.