I was about to say the same. loading the code line per line gave the error a
few lines after that one. Which explains...

Cheers
Joris

On Wed, May 26, 2010 at 9:27 PM, Erik Iverson <eriki@ccbr.umn.edu> wrote:

> Is the '`' character supposed to be there before the ## Add error bars
> comment?
>
> If that is the problem, let it be a good lesson    to use an editor with
> syntax highlighting. :)
>
>
>
>
> Brian Frizzelle wrote:
>
>> All,
>>
>> I think there may be some misunderstanding about my problem. In my code,
>> which is written as an R function, all of my variable names are short. I
>> get
>> that error when I try to source the function so I can call it. I just do
>> not
>> know why I'm getting the error, especially since I have written other very
>> similar functions that all work.
>>
>> So I have chosen to post the code below. I welcome any ideas about where
>> in
>> this code the error is occurring.
>>
>> ##########################################################
>> ###  SCRIPT: graph_hh_wealth_function.R
>> ###  DATE: April 22, 2010
>> ###  AUTHOR: Brian Frizzelle
>> ###                                 ###  This function draws two line
>> graphs of household-level wealth from a
>> variable ###  in a dataset output from an agent-based model run.
>> ###
>> ###  The two graphs are:
>> ###     1)      a line graph showing change in Wealth over time for each
>> individual
>> ###             household
>> ###   2)        a line graph of summary statistics of Wealth for the
>> households
>> (min,
>> ###             max, mean, and error bars)
>> ###
>> ###  Required Arguments:
>> ###   * inpath -        The path to the directory containing the
>> village-level
>> statistics
>> ###                     file
>> ###             NOTE: Use the UNIX forward slash (/) convention when
>> entering the path
>> ###                     and do not include a slash at the end of the path.
>> ###                     OK:             "D:/data"
>> ###                     Not OK:         "D:\data"
>> ###                     Not OK:         "D:/data/"
>> ###     * infile -      The name of the village-level statistics file
>> ###     * outpath -     The path to the directory where you want the
>> output graphics
>> to
>> ###                     be saved
>> ###     * outpref - The prefix that you want for the output PNG graphics
>> files
>> ###             NOTE: Do not include underscores (_) or spaces in the
>> output prefix.
>> ###                     Instead, please use dashes (-). Your prefix will
>> be separated
>> ###                     from the remainder of the file names by a dash.
>> ###
>> ###  Optional Arguments:
>> ###     * log.plot - Logical. Default is FALSE.
>> ###                     If TRUE, then the individual household wealth
>> graph is plotted
>> ###                     with a logarithmic Y-axis.
>> ###                     If FALSE, then the individual household wealth
>> graph is plotted
>> ###                     with a standard Y-axis.
>> ###     * err.bar -     Logical. Default is TRUE.
>> ###                     If TRUE, then error bars of 1 standard deviation
>> will be drawn
>> ###                     around the mean.
>> ###                     If FALSE, then no error bars will be drawn.
>> ###     * n.quantiles - Integer. Value between 3 and 10. Default is 0,
>> meaning
>> no
>> ###                     quantile lines will be drawn.
>> ###                     This is the number of bins into which you would
>> like the variable
>> ###                     separated. One line for each will be drawn, with
>> the exception of
>> ###                     the min and max, which are already drawn.
>> ##########################################################
>>
>> graph.hh.wealth <- function(inpath, infile, outpath, outpref,
>> log.plot=FALSE,                                     err.bar=TRUE,
>> n.quantiles=0)
>>
>> {
>>
>>        ##*************************************************
>>        ## Set the path and name of the input file
>>        ##  - The 'paste' command concatenates the two
>>        ##  - The 'skiplines' var sets the number of lines
>>        ##      to skip when reading in the dataset.
>>        ##*************************************************
>>        if (substr(inpath, nchar(inpath), nchar(inpath)) == "/")
>>                inpath <- substr(inpath, 0, nchar(inpath)-1)
>>        if (substr(outpath, nchar(outpath), nchar(outpath)) == "/")
>>                outpath <- substr(outpath, 0, nchar(outpath)-1)
>>        pathfile <- paste(inpath, infile, sep="/")
>>        skiplines <- 1
>>
>>        ##*************************************************
>>        ## Set the names of the output file graphics
>>        ##*************************************************
>>        fnout.wlth <- "hhwealth.png"
>>        fnout.wlthss <- "hhwealth-sumstats.png"
>>        output.png.wlth <- paste(outpath, "/", outpref, fnout.wlth, sep="")
>>        output.png.wlthss <- paste(outpath, "/", outpref, fnout.wlthss,
>> sep="")
>>
>>        ##*************************************************
>>        ## Read in the household-level output dataset
>>        ##*************************************************
>>        hhstats <- read.delim(file=pathfile, header=TRUE, sep ="\t",
>> dec=".",
>> skip=skiplines)
>>
>>        ##*************************************************
>>        ## Get some information from the household-level
>>        ## dataset for use in plotting.
>>        ##  - the village number
>>        ##  - a vector of the unique HH IDs
>>        ##  - the maximum number of model run years
>>        ##  - the maximum wealth among all households
>>        ##*************************************************
>>        villnum <- mean(hhstats$V84ID)
>>        uniq.hh.ids <- unique(hhstats$HHID00)
>>        max.yr <- max(hhstats$Year)
>>        max.wlth <- max(hhstats$Wealth)
>>
>>        ##*************************************************
>>        ## Extract out the vars needed for the individual
>>        ## household line graph
>>        ## Vars: Year, HHID00, Wealth, Status
>>        ##*************************************************
>>        hh.wealth <- hhstats[,c("Year","HHID00","Wealth","Status")]
>>        hh.wealth.pos <- hh.wealth[hh.wealth$Wealth >= 0,]
>>        hh.wealth.plot <- hh.wealth.pos[hh.wealth.pos$Status == 0 |
>> hh.wealth.pos$Status == 1,]
>>
>>        ##*************************************************
>>        ## Get the summary statistics by year for Wealth
>>        ##*************************************************
>>        ## Get a list of unique years for iterating
>>        unqyrlist <- unique(hh.wealth.plot$Year)
>>
>>        ## Determine the divisor for the quantiles
>>        div.q <- 1.0 / n.quantiles
>>
>>        ## Loop through years to extract summary statistics
>>        for (yr in min(unqyrlist):max(unqyrlist)) {
>>                # Get records for current year
>>                this.yr <- hh.wealth.plot[hh.wealth.plot$Year == yr,]
>>                # Calc summary statistics by statistic
>>                this.n <- dim(this.yr)[1]
>>                this.min <- min(this.yr$Wealth)
>>                this.max <- max(this.yr$Wealth)
>>                this.mean <- mean(this.yr$Wealth)
>>                this.med <- median(this.yr$Wealth)
>>                this.sd <- sd(this.yr$Wealth)
>>                this.ebneg <- this.mean-this.sd
>>                this.ebpos <- this.mean+this.sd
>>                this.sumstats <- c(yr, this.n, this.min, this.max,
>> this.mean,                                   this.med, this.sd,
>> this.ebneg, this.ebpos)
>>                # Convert vector to 1-row data frame
>>                this.df <- as.data.frame(t(as.matrix(this.sumstats)))
>>                colnames(this.df) <- c("Year", "Count", "Min", "Max",
>> "Mean", "Median",                                                 "SD",
>> "EB.Low", "EB.High")
>>                # Now, calculate the specified quantiles for this year
>>                names(yr) <- "Year"
>>                this.q <- as.data.frame(t(as.matrix(c(
>>      quantile(this.yr$Wealth, probs=seq(0, 1, div.q)), yr))))
>>                # Append the data frame to the output data frame
>>                if (yr == min(unqyrlist)) {
>>                        hh.wealth.plot.ss <- this.df
>>                        hh.wealth.quantiles <- this.q
>>                } else {
>>                        hh.wealth.plot.ss <-
>> rbind.data.frame(hh.wealth.plot.ss, this.df)
>>                        hh.wealth.quantiles <-
>> rbind.data.frame(hh.wealth.quantiles, this.q)
>>                }
>>        }
>>
>>        ##*************************************************
>>        ## Set up parameters for quantile plots
>>        ##*************************************************
>>        q.names <- c("", "", "Terciles", "Quantiles", "Quintiles",
>>                        "Sextiles", "Septiles", "Octiles", "Noniles",
>> "Deciles")
>>        q.labs <- c("1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th",
>> "9th")
>>        # Determine if median will be plotted
>>        if (n.quantiles %% 2) plot.med <- FALSE else plot.med <- TRUE
>>        # Determine which non-median quantile columns will be plotted
>>        if (n.quantiles %% 2) {                 # If the number of
>> quantiles is odd
>>                cols.q <- c(2:n.quantiles)
>>        } else {                                        # If the number of
>> quantiles is even
>>                cols.q <- c(2:(n.quantiles/2),
>> (2+(n.quantiles/2)):n.quantiles)
>>                col.med <- (n.quantiles/2) + 1
>> }
>>
>>        ##*************************************************
>>        ## Set up plotting parameters for the summary
>>        ## statistics graph
>>        ##*************************************************
>>        # Set y axis limits
>>        ylim.min <- min(hh.wealth.plot.ss)
>>        ylim.max <- max(hh.wealth.plot.ss)
>>        # Set title
>>        ttl.ss <- paste("Summary Statistics of Household Wealth Change Over
>> Time\n
>> (Village",              villnum, ")", sep="")
>>        # Set legend based on arguments
>>        leg.txt.ss <- c("Mean", "Min", "Max", "Error Bars", "# of HHs")
>>        if (err.bars == TRUE & n.quantiles == 0) {
>>                leg.txt.ss <- c("Mean", "Min", "Max", "Error Bars", "# of
>> HHs")
>>                leg.lty.ss <- c(1,2,4,5,0)
>>                leg.lwd.ss <- c(2,1,1,1,0)
>>                leg.pch.ss <- c(-1,-1,-1,-1,16)
>>                leg.col.ss <-
>> c("black","darkolivegreen4","chartreuse4","red","blue")
>>        } else if (err.bars == FALSE & n.quantiles >= 3) {
>>                if (n.quantiles %% 2) {                         # Odd
>> number of quantiles
>>                        leg.txt.ss <- c("Mean", "Min", "Max",
>> q.names[n.quantiles], "# of HHs")
>>                        leg.lty.ss <- c(1,2,4,3,0)
>>                        leg.lwd.ss <- c(2,1,1,1,0)
>>                        leg.pch.ss <- c(-1,-1,-1,-1,16)
>>                        leg.col.ss <-
>> c("black","darkolivegreen4","chartreuse4","orange","blue")
>>                } else {                                                #
>> Even number of quantiles
>>                        leg.txt.ss <- c("Mean", "Min", "Max", "Median",
>> q.names[n.quantiles],                                           "# of HHs")
>>                        leg.lty.ss <- c(1,2,4,3,3,0)
>>                        leg.lwd.ss <- c(2,1,1,2,1,0)
>>                        leg.pch.ss <- c(-1,-1,-1,-1,-1,16)
>>                        leg.col.ss <- c("black", "darkolivegreen4",
>> "chartreuse4", "orange",
>>  "orange", "blue")
>>                }
>>        } else if (err.bars == TRUE & n.quantiles >= 3) {
>>                if (n.quantiles %% 2) {                         # Odd
>> number of quantiles
>>                        leg.txt.ss <- c("Mean", "Min", "Max", "Error Bars",
>> q.names[n.quantiles],                                               "# of
>> HHs")
>>                        leg.lty.ss <- c(1,2,4,5,3,0)
>>                        leg.lwd.ss <- c(2,1,1,1,1,0)
>>                        leg.pch.ss <- c(-1,-1,-1,-1,-1,16)
>>                        leg.col.ss <- c("black", "darkolivegreen4",
>> "chartreuse4", "red",
>> "orange",
>>                                                "blue")
>>                } else {                                                #
>> Even number of quantiles
>>                        leg.txt.ss <- c("Mean", "Min", "Max", "Error Bars",
>> "Median",                                           q.names[n.quantiles], "#
>> of HHs")
>>                        leg.lty.ss <- c(1,2,4,5,3,3,0)
>>                        leg.lwd.ss <- c(2,1,1,1,2,1,0)
>>                        leg.pch.ss <- c(-1,-1,-1,-1,-1,-1,16)
>>                        leg.col.ss <- c("black", "darkolivegreen4",
>> "chartreuse4", "red",
>> "orange",
>>                                                "orange","blue")
>>                }
>>        } else {
>>                leg.txt.ss <- c("Mean", "Min", "Max", "# of HHs")
>>                leg.lty.ss <- c(1,2,4,0)
>>                leg.lwd.ss <- c(2,1,1,0)
>>                leg.pch.ss <- c(-1,-1,-1,16)
>>                leg.col.ss <- c("black", "darkolivegreen4", "chartreuse4",
>> "blue")
>>        }
>>
>>
>>        ##*************************************************
>>        ## Set up vector of possible colors for the lines
>>        ##*************************************************
>>        colorset <- c(3:12, 26:62, 67:79, 81, 83:137, 139, 142:151)
>>
>>        ##*************************************************
>>        ## Set up plotting parameters for the individual
>>        ## household graph
>>        ##*************************************************
>>        ## Create a vector of colors from the colorset
>>        ## above, one for every HHID00
>>        colors.id <- sample(colorset, length(uniq.hh.ids), replace=TRUE)
>>        ## Other parameters
>>        ttl.hh <- paste("Change in Household Wealth Over Time\n (Village",
>>              villnum, ")", sep="")
>>        leg.txt.hh <- c("Old Households", "Split Households")
>>
>>        ##*************************************************
>>        ## Plot household-level summary statistics
>>        ##*************************************************
>>        png(filename=output.png.wlthss, width=10, height=7, units="in",
>> res=300)
>>
>>        ## Set initial plot with mean
>>        plot(hh.wealth.plot.ss$Year,            # x var
>>                hh.wealth.plot.ss$Mean,         # y var (MEAN)
>>                type="l",                               # line graph
>>                xlim=c(0,max.yr),                       # x-axis limits
>>                ylim=c(ylim.min, ylim.max),     # y-axis limits
>>                lty=1,                          # solid line
>>                lwd=2,                          # line thickness
>>                xlab="",
>>                ylab="Wealth",                  # y-axis label
>>                main=ttl.ss)
>>        ## Add MIN
>>        lines(hh.wealth.plot.ss$Year,           # x var
>>                hh.wealth.plot.ss$Min,          # y var (MIN)
>>                type="l",                               # line graph
>>                col="darkolivegreen4",
>>                lty=2)
>>        ## Add MAX
>>        lines(hh.wealth.plot.ss$Year,           # x var
>>                hh.wealth.plot.ss$Max,          # y var (MAX)
>>                type="l",                               # line graph
>>                col="chartreuse4",
>>                lty=4)
>>
>> `       ## Add ERROR BARS if Argument 'err.bars' is TRUE
>>        if (err.bars == TRUE) {
>>                ## Add LOW ERROR BAR
>>                lines(hh.wealth.plot.ss$Year,                   # x var
>>                        hh.wealth.plot.ss$EB.Low,               # y var (EB
>> LOW)
>>                        type="l",                                       #
>> line graph
>>                        col="red",
>>                        lty=3)
>>                ## Add HIGH ERROR BAR
>>                lines(hh.wealth.plot.ss$Year,                   # x var
>>                        hh.wealth.plot.ss$EB.High,              # y var (EB
>> HIGH)
>>                        type="l",                                       #
>> line graph
>>                        col="red",
>>                        lty=3)
>>        }
>>        ## Add QUANTILES if Argument 'n.quantiles' is >= 3
>>        if (n.quantiles >= 3) {
>>                # Cycle through column numbers and draw quantile lines
>>                for (qcol in 1:length(cols.q)) {
>>                        lines(hh.wealth.quantiles$Year, # Plot quantile
>> lines
>>                                hh.wealth.quantiles[,cols.q[qcol]],
>>                                type="l",
>>                                col="orange",
>>                                lty=3)
>>                        }
>>                # Add MEDIAN line
>>                if (plot.med == TRUE) {
>>                        lines(hh.wealth.quantiles$Year, # Plot median
>>                                hh.wealth.quantiles[,col.med],
>>                                type="l",
>>                                col="orange",
>>                                lty=3,
>>                                lwd=2)
>>                }
>>        }
>>        ## Add COUNT
>>        points(hh.wealth.plot.ss$Year,  # x var
>>                hh.wealth.plot.ss$Count,        # y var (COUNT)
>>                type="p",                               # line graph
>>                pch=16,
>>                col="blue",
>>                cex=0.5)
>>        ## Add LEGEND
>>        legend(x="topright",
>>                leg.txt.ss,
>>                lty=leg.lty.ss,
>>                lwd=leg.lwd.ss,
>>                pch=leg.pch.ss,
>>                col=leg.col.ss,
>>                cex=1)
>>
>>        dev.off()
>>
>>
>>        ##*************************************************
>>        ## Plot wealth for individual households
>>        ##*************************************************
>>        png(filename=output.png.wlth, width=10, height=7, units="in",
>> res=300)
>>
>>        ## Create an empty plot
>>        if (log.plot == FALSE) {
>>                plot(hh.wealth.plot$Year, hh.wealth.plot$Wealth,
>>                        type="n",
>>                        xlim=c(0,max.yr),
>>                        main=ttl.hh,
>>                        xlab="",
>>                        ylab="Wealth")
>>        } else {
>>                plot(hh.wealth.plot$Year, hh.wealth.plot$Wealth,
>>                        log="y",
>>                        type="n",
>>                        xlim=c(0,max.yr),
>>                        main=ttl.hh,
>>                        xlab="",
>>                        ylab="Wealth (log scale)")
>>        }
>>
>>        #legend(x=leg.x.coord, y=leg.y.coord,   # Sets the location for the
>> legend
>>        legend(x="topright",
>>                leg.txt.hh,                             # text in the
>> legent
>>                col=c("red", "red"),                    # sets the line
>> colors in the legend
>>                lty=c(1,3),                             # draws lines
>>                lwd=c(1,1),                             # sets line
>> thickness
>>        #       bty="n",                                        # no border
>> on the legend
>>                ncol=2,                                         # makes it
>> a 2-column legend
>>                cex=0.8)                                        # sets the
>> legend text size
>>
>>        ## Loop through IDs and add a line for each
>>        for (id in 1:length(uniq.hh.ids)) {
>>                ## Get the current HH ID
>>                this.id <- uniq.hh.ids[id]
>>
>>                ## Extract the records for the current ID
>>                this.sub <- hh.wealth.plot[hh.wealth.plot$HHID00 ==
>> this.id,]
>>
>>                if (dim(this.sub)[1] > 0) {
>>
>>                        ## Set line type
>>                        if (mean(this.sub$Status) == 0) {
>>                                ltype <- 1
>>                        } else {
>>                                ltype <- 3
>>                        }
>>
>>                        ## Add the line for this ID
>>                        lines(this.sub$Year, this.sub$Wealth,
>>                                type="l",
>> col= colors.id[id],
>>                                lwd=1,
>>                                lty=ltype)
>>                }
>>
>>        }
>>
>>        dev.off()
>>
>> }
>>
>
> ______________________________________________
> R-help@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.
>



-- 
Joris Meys
Statistical Consultant

Ghent University
Faculty of Bioscience Engineering
Department of Applied mathematics, biometrics and process control

Coupure Links 653
B-9000 Gent

tel : +32 9 264 59 87
Joris.Meys@Ugent.be
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php

	[[alternative HTML version deleted]]

