Dear group,
Here is my function:
#return the daily PL for day y
PLDaily<-function(x,y)
{
#find elements in my directory with "LSCPos" in the name, keep the
numeric
part in the name and
#create a list
l<-gsub("\\D","",dir()[grep("LSCPos",dir())])
#select in the list the desired elements
assign("sel",l[which(l==x):which(l==y)],envir=.GlobalEnv)
#here is another solution select<-l[l %in% seq(x, y)]
#first we need to create the Pos and Trad elements
for (i in sel) {
assign(paste("Pos",i,sep=""),position(i),envir=.GlobalEnv)
assign(paste("Trad",i,sep=""),trade(i),envir=.GlobalEnv)
}
#access elements in my environment
posA<-get(paste(c("Pos",x),collapse=""))
posB<-get(paste(c("Pos",y),collapse=""))
av<-get(paste(c("Trad",y),collapse=""))
#apply some change on element columns then create only one data frame with
the three elements
allcon<-ddply(rbind(av[,1:3],
transform(posA,prix=POSITION*SETTLEMENT,SETTLEMENT=NULL),
transform(posB, prix = -POSITION * SETTLEMENT, SETTLEMENT = NULL,
POSITION = POSITION * -1)),
"DESCRIPTION",summarise,pl=sum(prix),quantity=sum(POSITION))
#remove the date in $DESCRPTION and add a new column $SHORTDESCRIPTION
allcon$SHORTDESCRIPTION<-sub('
[a-z]{3}/[0-9]{2}','',allcon$DESCRIPTION,ignore.case=TRUE)
#read the contractvalue file
value<-read.csv2("contractvalue.csv",sep=",",h=T,strip.white=T)
#merge "value" with "allcon", change some columns, then
merge with PosB,
replace NA by zero and assign the final result to element PL
zz<-merge(transform(merge(value,allcon,all.y=T),SHORTDESCRIPTION=NULL,
VALUE=NULL,PL=-VALUE*pl,quantity=NULL),PosB,all.x=T,sort=F)
zz[is.na(zz)]<-0
#PL<-zz[c(1,3,4)]
assign(paste("DailyPL",y,sep=""),zz[,c(1,3,4)],envir=.GlobalEnv)
}
Here is what I get :
> PLDaily(100524,100525)
Error in as.data.frame(y) : object 'PosB' not found
> ls()
[1] "PLDaily" "Pos100524" "Pos100525"
"position" "sel"
"Trad100524" "Trad100525" "trade"
Why R can't find "PosB" ?
TY for your help.
On 2010-05-26 1:17, arnaud Gaboury wrote:> Dear group, > > Here is my function: > > > #return the daily PL for day y > > PLDaily<-function(x,y) > > > { > > #find elements in my directory with "LSCPos" in the name, keep the numeric > part in the name and > #create a list > l<-gsub("\\D","",dir()[grep("LSCPos",dir())]) > > #select in the list the desired elements > assign("sel",l[which(l==x):which(l==y)],envir=.GlobalEnv) > #here is another solution select<-l[l %in% seq(x, y)] > > #first we need to create the Pos and Trad elements > > for (i in sel) { > > assign(paste("Pos",i,sep=""),position(i),envir=.GlobalEnv) > assign(paste("Trad",i,sep=""),trade(i),envir=.GlobalEnv) > > } > #access elements in my environment > posA<-get(paste(c("Pos",x),collapse="")) > posB<-get(paste(c("Pos",y),collapse="")) > av<-get(paste(c("Trad",y),collapse="")) > > #apply some change on element columns then create only one data frame with > the three elements > allcon<-ddply(rbind(av[,1:3], > transform(posA,prix=POSITION*SETTLEMENT,SETTLEMENT=NULL), > transform(posB, prix = -POSITION * SETTLEMENT, SETTLEMENT = NULL, > POSITION = POSITION * -1)), > "DESCRIPTION",summarise,pl=sum(prix),quantity=sum(POSITION)) > > #remove the date in $DESCRPTION and add a new column $SHORTDESCRIPTION > allcon$SHORTDESCRIPTION<-sub(' > [a-z]{3}/[0-9]{2}','',allcon$DESCRIPTION,ignore.case=TRUE) > > #read the contractvalue file > value<-read.csv2("contractvalue.csv",sep=",",h=T,strip.white=T) > > #merge "value" with "allcon", change some columns, then merge with PosB, > replace NA by zero and assign the final result to element PL > zz<-merge(transform(merge(value,allcon,all.y=T),SHORTDESCRIPTION=NULL, > VALUE=NULL,PL=-VALUE*pl,quantity=NULL),PosB,all.x=T,sort=F) > zz[is.na(zz)]<-0 > #PL<-zz[c(1,3,4)] > assign(paste("DailyPL",y,sep=""),zz[,c(1,3,4)],envir=.GlobalEnv) > > } > > Here is what I get : > >> PLDaily(100524,100525) > Error in as.data.frame(y) : object 'PosB' not found > >> ls() > [1] "PLDaily" "Pos100524" "Pos100525" "position" "sel" > "Trad100524" "Trad100525" "trade" > > Why R can't find "PosB" ?Quite possibly because R is case-sensitive. You have defined 'posB' and you're looking for 'PosB'. -Peter Ehlers
Hi, The first problem (I think) is your for loop: for (i in sel), what is "sel"?! Then you might want to write "position[i]" and "trade[i]" (I don't think that position and trade are functions, or they are in a package you don't specify). Depending on the class of position and trade, you might need position[[i]] and trade[[i]] I didn't really go further. The only problem I have is why only PosB? If I'm right, PosA shouldn't work either. In any case, you have to find by yourself where exactly is the problem. You can run line by line by simulating the loop yourself (replacing i with 1, then with 2 and so on) to see if what happens at each place is really what you want. It might be a cheap solution, but it does really help me to make sure that it does what I need. Once you've found the problem, and if you cannot resolve it, then contact the list, it will be much easier for anyone to help you if the problem is identified than sending a long code without even the sample data to test it. HTH, Ivan Le 5/26/2010 09:17, arnaud Gaboury a ?crit :> Dear group, > > Here is my function: > > > #return the daily PL for day y > > PLDaily<-function(x,y) > > > { > > #find elements in my directory with "LSCPos" in the name, keep the numeric > part in the name and > #create a list > l<-gsub("\\D","",dir()[grep("LSCPos",dir())]) > > #select in the list the desired elements > assign("sel",l[which(l==x):which(l==y)],envir=.GlobalEnv) > #here is another solution select<-l[l %in% seq(x, y)] > > #first we need to create the Pos and Trad elements > > for (i in sel) { > > assign(paste("Pos",i,sep=""),position(i),envir=.GlobalEnv) > assign(paste("Trad",i,sep=""),trade(i),envir=.GlobalEnv) > > } > #access elements in my environment > posA<-get(paste(c("Pos",x),collapse="")) > posB<-get(paste(c("Pos",y),collapse="")) > av<-get(paste(c("Trad",y),collapse="")) > > #apply some change on element columns then create only one data frame with > the three elements > allcon<-ddply(rbind(av[,1:3], > transform(posA,prix=POSITION*SETTLEMENT,SETTLEMENT=NULL), > transform(posB, prix = -POSITION * SETTLEMENT, SETTLEMENT = NULL, > POSITION = POSITION * -1)), > "DESCRIPTION",summarise,pl=sum(prix),quantity=sum(POSITION)) > > #remove the date in $DESCRPTION and add a new column $SHORTDESCRIPTION > allcon$SHORTDESCRIPTION<-sub(' > [a-z]{3}/[0-9]{2}','',allcon$DESCRIPTION,ignore.case=TRUE) > > #read the contractvalue file > value<-read.csv2("contractvalue.csv",sep=",",h=T,strip.white=T) > > #merge "value" with "allcon", change some columns, then merge with PosB, > replace NA by zero and assign the final result to element PL > zz<-merge(transform(merge(value,allcon,all.y=T),SHORTDESCRIPTION=NULL, > VALUE=NULL,PL=-VALUE*pl,quantity=NULL),PosB,all.x=T,sort=F) > zz[is.na(zz)]<-0 > #PL<-zz[c(1,3,4)] > assign(paste("DailyPL",y,sep=""),zz[,c(1,3,4)],envir=.GlobalEnv) > > } > > Here is what I get : > > >> PLDaily(100524,100525) >> > Error in as.data.frame(y) : object 'PosB' not found > > >> ls() >> > [1] "PLDaily" "Pos100524" "Pos100525" "position" "sel" > "Trad100524" "Trad100525" "trade" > > Why R can't find "PosB" ? > > TY for your help. > > ______________________________________________ > R-help at 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. > >-- Ivan CALANDRA PhD Student University of Hamburg Biozentrum Grindel und Zoologisches Museum Abt. S?ugetiere Martin-Luther-King-Platz 3 D-20146 Hamburg, GERMANY +49(0)40 42838 6231 ivan.calandra at uni-hamburg.de ********** http://www.for771.uni-bonn.de http://webapp5.rrz.uni-hamburg.de/mammals/eng/mitarbeiter.php