Brian Frizzelle
2010-May-26 14:53 UTC
[R] error "variable names are limited to 256 bytes" when sourcing code
I've written a function that takes some input data output from a simulation model and creates some graphs. It's not very complicated code, and it works perfectly fine if I just run the code as is. But I have converted it into a function so we call it externally, and when I try to source the code to test the function, I get the error message "variable names are limited to 256 bytes". I've tried searching online for a solution to this, but everything I have come across deals with this error in relation to input data, not a function. The code is 389 lines long, so I'd rather not paste it here and clog up inboxes. If you have an idea as to why this is happening and would like to see the code, please email me and I will send it to you. Thanks in advance. -- Brian Frizzelle Spatial Analysis Services Carolina Population Center University of North Carolina at Chapel Hill Voice: 919-966-6663 Fax: 919-966-6638 Email: brian_frizzelle at unc.edu
Wu Gong
2010-May-26 17:00 UTC
[R] error "variable names are limited to 256 bytes" when sourcing code
I can only repeat your error message :)> n256 <- paste(rep("A",256),collapse="") > assign(n256, 1) > n257 <- paste(rep("A",257),collapse="") > assign(n257, 1)Error in assign(n257, 1) : variable names are limited to 256 bytes ----- A R learner. -- View this message in context: http://r.789695.n4.nabble.com/error-variable-names-are-limited-to-256-bytes-when-sourcing-code-tp2231800p2232014.html Sent from the R help mailing list archive at Nabble.com.
Brian Frizzelle
2010-May-26 19:20 UTC
[R] error "variable names are limited to 256 bytes" when sourcing code
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()
}
--
View this message in context:
http://r.789695.n4.nabble.com/error-variable-names-are-limited-to-256-bytes-when-sourcing-code-tp2231800p2232209.html
Sent from the R help mailing list archive at Nabble.com.
Duncan Murdoch
2010-May-26 20:22 UTC
[R] error "variable names are limited to 256 bytes" when sourcing code
Brian Frizzelle wrote:> I've written a function that takes some input data output from a > simulation model and creates some graphs. It's not very complicated > code, and it works perfectly fine if I just run the code as is. > > But I have converted it into a function so we call it externally, and > when I try to source the code to test the function, I get the error > message "variable names are limited to 256 bytes". I've tried searching > online for a solution to this, but everything I have come across deals > with this error in relation to input data, not a function. > > The code is 389 lines long, so I'd rather not paste it here and clog up > inboxes. If you have an idea as to why this is happening and would like > to see the code, please email me and I will send it to you. >Current versions of R will tell you which line contained the error. Can't you find and post just that one line? If you aren't seeing an error report, you could divide and conquer: edit blocks out of your file until you can figure out which lines matter. My guess would be something involving backticks (i.e. things like `x`); R will see the first one, and collect characters until the next one as a single identifier. Duncan Murdoch