Ajay Shah
2004-Mar-02 18:00 UTC
[R] Stuck in trying to convert repetitive code into a function
Folks,
I have the following repetitive code which works correctly:
A = read.table(file="junior.csv", sep=",",
col.names=c("date", "l"));
A$date = chron(as.character(A$date), format="m/d/y");
r.junior = levels2weeklyret(lastfriday, A$date, A$l);
plot(A$date, A$l, type="l", col="red", main="Junior
levels")
z <- locator(1)
A = read.table(file="kospi.csv", sep=",",
col.names=c("date", "l"));
A$date = chron(as.character(A$date), format="m/d/y");
r.kospi = levels2weeklyret(lastfriday, A$date, A$l);
plot(A$date, A$l, type="l", col="red", main="Kospi
levels")
z <- locator(1)
I tried to write it more nicely as follows:
eat.a.file <- function(fn, label, lastfriday) {
f = read.table(file=fn, sep=",", col.names=c("date",
"l"));
f$date = chron(as.character(f$date), format="m/d/y");
plot(f$date, f$l, type="l", col="red", main=label);
z <- locator(1);
return(levels2weeklyret(lastfriday, f$date, f$l));
}
r.junior = eat.a.file(fn="junior.csv", label="Junior",
lastfriday);
r.kospi = eat.a.file(fn="kospi.csv", label="Kospi",
lastfriday);
When I do this, I get this error at the first of the two function calls:
Error in vector("double", length) : negative length vectors are not
allowed
Execution halted
I have tried hard to experiment with various ways of writing it, but
am truly stumped. Any ideas on what might be going wrong? I am new to
R and have only written a few functions so far.
On a slightly related note, what is the situation in R on passing by
reference versus passing by value? I looked at the standard docs and
they seem to insist that a function can only send back one return
value. How does a function send back multiple things that it has
created?
--
Ajay Shah Consultant
ajayshah at mayin.org Department of Economic Affairs
http://www.mayin.org/ajayshah Ministry of Finance, New Delhi
Simon Fear
2004-Mar-03 09:22 UTC
[R] Stuck in trying to convert repetitive code into a function
I can't debug this because you haven't said what levels2weeklyret() does. However, I can offer a tip: use traceback() straight after the error to see exactly where it goes wrong. If still baffled, use debug() [takes a bit of learning]. To return multiple values, return a list (see ?return) or other multi-component structure. If I may offer another word of advice: don't use single letter variable names, especially l which is identical to 1 in many fonts, and don't use f or fn except for a function name. Also we are all supposed to use names like `eatFile` rather than the old-style `eat.file`, though R base itself is full of names.somethings and probably always will be. HTH> -----Original Message----- > From: Ajay Shah [mailto:ajayshah at mayin.org] > Sent: 02 March 2004 18:00 > To: r-help > Subject: [R] Stuck in trying to convert repetitive code into > a function > > > Security Warning: > If you are not sure an attachment is safe to open contact > Andy on x234. > There are 0 attachments with this message. > ________________________________________________________________ > > Folks, > > I have the following repetitive code which works correctly: > > A = read.table(file="junior.csv", sep=",", > col.names=c("date", "l")); > A$date = chron(as.character(A$date), format="m/d/y"); > r.junior = levels2weeklyret(lastfriday, A$date, A$l); > plot(A$date, A$l, type="l", col="red", main="Junior levels") > z <- locator(1) > > A = read.table(file="kospi.csv", sep=",", > col.names=c("date", "l")); > A$date = chron(as.character(A$date), format="m/d/y"); > r.kospi = levels2weeklyret(lastfriday, A$date, A$l); > plot(A$date, A$l, type="l", col="red", main="Kospi levels") > z <- locator(1) > > I tried to write it more nicely as follows: > > eat.a.file <- function(fn, label, lastfriday) { > f = read.table(file=fn, sep=",", col.names=c("date", "l")); > f$date = chron(as.character(f$date), format="m/d/y"); > plot(f$date, f$l, type="l", col="red", main=label); > z <- locator(1); > return(levels2weeklyret(lastfriday, f$date, f$l)); > } > r.junior = eat.a.file(fn="junior.csv", label="Junior", lastfriday); > r.kospi = eat.a.file(fn="kospi.csv", label="Kospi", lastfriday); > > When I do this, I get this error at the first of the two > function calls: > > Error in vector("double", length) : negative length vectors > are not allowed > Execution halted > > I have tried hard to experiment with various ways of writing it, but > am truly stumped. Any ideas on what might be going wrong? I am new to > R and have only written a few functions so far. > > On a slightly related note, what is the situation in R on passing by > reference versus passing by value? I looked at the standard docs and > they seem to insist that a function can only send back one return > value. How does a function send back multiple things that it has > created? > > -- > Ajay Shah Consultant > ajayshah at mayin.org Department of Economic Affairs > http://www.mayin.org/ajayshah Ministry of Finance, New Delhi > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide!http://www.R-project.org/posting-guide.html Simon Fear Senior Statistician Syne qua non Ltd Tel: +44 (0) 1379 644449 Fax: +44 (0) 1379 644445 email: Simon.Fear at synequanon.com web: http://www.synequanon.com Number of attachments included with this message: 0 This message (and any associated files) is confidential and\...{{dropped}}
Gabor Grothendieck
2004-Mar-03 12:10 UTC
[R] Stuck in trying to convert repetitive code into a function
Issue the command:
debug(eat.a.file)
and then run your eat.a.file call. This will step you through
the function showing where it goes wrong.
By the way,
- you don't need semicolons at the end of each line,
- the format you are specifying on chron is the default anyways
so you can leave out format=
- if you give use the argument as.is=1 on read.table then it
will return the date column as a character so you can convert it
to character like this: A$date <- chron(A$date)
---
Folks,
I have the following repetitive code which works correctly:
A = read.table(file="junior.csv", sep=",",
col.names=c("date", "l"));
A$date = chron(as.character(A$date), format="m/d/y");
r.junior = levels2weeklyret(lastfriday, A$date, A$l);
plot(A$date, A$l, type="l", col="red", main="Junior
levels")
z <- locator(1)
A = read.table(file="kospi.csv", sep=",",
col.names=c("date", "l"));
A$date = chron(as.character(A$date), format="m/d/y");
r.kospi = levels2weeklyret(lastfriday, A$date, A$l);
plot(A$date, A$l, type="l", col="red", main="Kospi
levels")
z <- locator(1)
I tried to write it more nicely as follows:
eat.a.file <- function(fn, label, lastfriday) {
f = read.table(file=fn, sep=",", col.names=c("date",
"l"));
f$date = chron(as.character(f$date), format="m/d/y");
plot(f$date, f$l, type="l", col="red", main=label);
z <- locator(1);
return(levels2weeklyret(lastfriday, f$date, f$l));
}
r.junior = eat.a.file(fn="junior.csv", label="Junior",
lastfriday);
r.kospi = eat.a.file(fn="kospi.csv", label="Kospi",
lastfriday);
When I do this, I get this error at the first of the two function calls:
Error in vector("double", length) : negative length vectors are not
allowed
Execution halted
I have tried hard to experiment with various ways of writing it, but
am truly stumped. Any ideas on what might be going wrong? I am new to
R and have only written a few functions so far.
On a slightly related note, what is the situation in R on passing by
reference versus passing by value? I looked at the standard docs and
they seem to insist that a function can only send back one return
value. How does a function send back multiple things that it has
created?
--
Ajay Shah Consultant
ajayshah at mayin.org Department of Economic Affairs
http://www.mayin.org/ajayshah Ministry of Finance, New Delhi