byname <- function ( action = NULL, name = NULL, value_in = NULL ) #*****************************************************************************80 # ## byname() controls a set of named persistent data. # # Discussion: # # Three values are stored, named ALPHA, BETA and GAMMA. # # Licensing: # # This code is distributed under the MIT license. # # Modified: # # 11 May 2021 # # Author: # # John Burkardt # # Input: # # string ACTION (case insensitive, only first character important) # "Get" get the value # "Print" print the value # "Reset" reset value to default # "Set" set the value # # string NAME, the name of the parameter (case insensitive) # "ALPHA" # "BETA" # "GAMMA" # "*" (all variables) # NAME is required for "Get" and "Set". # NAME, if omitted, is assumed "*" for "Print" and "Reset". # # VALUE_IN. # Only used for "Set" command. # # Output: # # VALUE_OUT. # If NAME was specified on input, and was not "*", then # VALUE_OUT is the current value of the corresponding variable. # Otherwise, VALUE_OUT is empty. # { # # Persistent data is stored as attributes associated with the function. # alpha <- attr ( byname, "alpha" ) alpha_default <- attr ( byname, "alpha_default" ) beta <- attr ( byname, "beta" ) beta_default <- attr ( byname, "beta_default" ) gamma <- attr ( byname, "gamma" ) gamma_default <- attr ( byname, "gamma_default" ) # # Initialize the persistent data on first call, and again if x not input. # Note that we need to use a DOUBLE ARROW assignment here! # This makes the assignment "globally". # if ( is.null ( alpha ) ) { alpha_default = 1.0 alpha = alpha_default beta_default = 2.0 beta = beta_default gamma_default = 3.0 gamma = gamma_default attr ( byname, "alpha" ) <<- alpha attr ( byname, "alpha_default" ) <<- alpha_default attr ( byname, "beta" ) <<- beta attr ( byname, "beta_default" ) <<- beta_default attr ( byname, "gamma" ) <<- gamma attr ( byname, "gamma_default" ) <<- gamma_default } # # Handle the ACTION. # if ( is.null ( action ) ) { action2 = "p" } # # Reject bad action. # else { action2 = substr ( action, 1, 1 ) action2 = tolower ( action2 ) match = ( action2 == "g" ) | ( action2 == "p" ) | ( action2 == "r" ) | ( action2 == "s" ) if ( ! match ) { cat ( '\n' ) cat ( 'byname: Fatal error!\n' ) cat ( ' Legal actions are "g", "p", "r", "s"\n' ) cat ( ' Not "', action, '"\n' ) stop ( 'byname - Fatal error!' ) } } # # Handle the NAME. # if ( is.null ( name ) ) { name2 = "*" } else { name2 = substr ( name, 1, 1 ) name2 = tolower ( name2 ) match = ( name2 == "a" ) | ( name2 == "b" ) | ( name2 == "g" ) | ( name2 == "*" ) if ( ! match ) { cat ( '\n' ) cat ( 'byname: Fatal error!\n' ) cat ( ' Legal names are "alpha", "beta", "gamma", "*"\n' ); cat ( ' Not "', name, '"\n' ) stop ( 'byname - Fatal error!' ) } } # # Handle VALUE_IN. # if ( is.null ( value_in ) ) { value_in = 0.0 } # # Carry out requested action. # value_out = NULL if ( action2 == "g" ) { if ( name2 == "a" ) { value_out = alpha } else if ( name2 == "b" ) { value_out = beta } else if ( name2 == "g" ) { value_out = gamma } } else if ( action2 == "p" ) { if ( name2 == "a" | name2 == "*" ) { cat ( ' alpha = ', alpha, '\n' ) } if ( name2 == "a" ) { value_out = alpha } if ( name2 == "b" | name2 == "*" ) { cat ( ' beta = ', beta, '\n' ) } if ( name2 == "b" ) { value_out = beta } if ( name2 == "g" | name2 == "*" ) { cat ( ' gamma = ', gamma, '\n' ) } if ( name2 == "g" ) { value_out = gamma } } else if ( action2 == "r" ) { if ( name2 == "a" | name2 == "*" ) { alpha = alpha_default } if ( name2 == "a" ) { value_out = alpha } if ( name2 == "b" | name2 == "*" ) { beta = beta_default } if ( name2 == "b" ) { value_out = beta } if ( name2 == "g" | name2 == "*" ) { gamma = gamma_default } if ( name2 == "g" ) { value_out = gamma } } else if ( action2 == "s" ) { if ( name2 == "a" ) { alpha = value_in value_out = alpha } if ( name2 == "b" ) { beta = value_in value_out = beta } if ( name2 == "g" ) { gamma = value_in value_out = gamma } } # # Store persistent values. # attr ( byname, "alpha" ) <<- alpha attr ( byname, "alpha_default" ) <<- alpha_default attr ( byname, "beta" ) <<- beta attr ( byname, "beta_default" ) <<- beta_default attr ( byname, "gamma" ) <<- gamma attr ( byname, "gamma_default" ) <<- gamma_default output = c ( value_out ) return ( output ) }