Dear Mike:
I don't know.
1. What specific error message do you get?
2. Your example is too long for me to parse, especially with
the color being stripped before I saw it.
3. Have you tried using "debug(cro.etest.grab)", then
walking through the code line by line until you get to the offending
line. Then you can study the error message and try different things
quickly. This may not work, but typically provides access to more
information on the problem AND often usually substantially the test
cycle for potential fixes.
Hope this helps.
Spencer
Mike Williamson wrote:> All,
>
> I am having trouble with a "read.table()" function that is
inside of
> another function. But if I call the function by itself, it works fine.
> Moreover, if I run the script on a Mac OS X (with the default Mac OS X
> version of R installed, rev 2.8), it works fine. But it does not work if I
> run it on windows vista (also default Windows version of R, rev. 2.8).
>
> Again, both calls shown below work fine in Mac, but only the call by
> itself works in Vista. The other call embedded in a function does not.
>
> Thanks in advance for all the help!!
> Regards, Mike
>
> Below are the calls:
>
> #############################################
> Below is the call which DOES work, as long as it is called by itself.
> ##############################################
>
>
>
> * eTestData <-
>
read.table("C:/Users/<userID>/Documents/R/eTestDataDir/EtestExample.csv",header
> = TRUE,
> as.is = TRUE)
> *
>
>
> #############################################
> Below is the call which does NOT work. The problem function call
> highlighted in *red*
> Especially strange with this is that there is a call below to ask for all
> the files in the directory, which I
> have highlighted in *purple*, and that call works fine. So it is some sort
> of permissions thing.
> ##############################################
>
> cro.etest.grab <- function(dataDir="raw.etest.data",
header="hdr",
>
dataHeaders="datasets/eTestDataHeaders.txt",
> slotCol="Wafer",
dateFormat="%m/%d/%Y %H:%M:%S",
> lotCol="eTestLotID") {
> ### Function: grab data in its raw form from SVTC's HP electrical
tester and
> ### "munge" it into a format more friendly for analysis
in R.
> ### Requires: dataDir -- the directory where the raw SVTC data set is
> stored
> ### header -- the differentiation between the names of the
> data
> ### files and the header files. E.g., if data
file
> ### is "CORR682..18524" and header file
is
> ### "CORR682.hdr.18524", then the header
is "hdr".
> ### dataHeaders -- Sometimes the labels for the data is missing,
> but
> ### they are NEARLY always the same. If the
labels
> ### are ever missing, this fills them in with the
> ### vector of headers given here. E.g.,
c("Wafer",
> ### "Site","R2_ET1_M1",etc.)
> ### slotCol -- In the data file, typically column
"Wafer" is
> ### actually the slot ID. This renames it to Slot.
> ### So, SlotCol is the name IN THE RAW DATA.
> ### lotCol -- The data files have no lot ID column, the lot
> ID
> ### is grabbed from the file name. This provides a
> ### column header name for the lot ID.
> ### dateFormat -- The test data header file has eTest time,
> written
> ### in the format month/day/year hour:minute:sec.
> ### If another format is being read, it can be
> ### altered here.
> dataHeaders <- read.table(dataHeaders, stringsAsFactors = FALSE)[,1]
>
> print(paste("dataDir:",dataDir,"
header:",header,"
> slotCol:",slotCol,
> " lotCol:",lotCol))
> *allFiles <- list.files(path = dataDir)*
> tmp <- grep("hdr",allFiles,ignore.case = TRUE)
> dataFiles <- allFiles[-tmp]
> hdrFiles <-
sub("\\.(.*)\\.","\\.hdr\\1\\.",dataFiles)
> * eTestData <-
read.table(paste(dataDir,"/",dataFiles[1],sep=""),header
> TRUE,
> as.is = TRUE)
> * eTestData[,slotCol] <- as.character(eTestData[,slotCol])
> eTestData[,lotCol] <- rep(dataFiles[1],length(eTestData[,1]))
> tmp <- try(scan(paste(dataDir,"/", hdrFiles[1],
sep=""), what > "character",
> sep="\n", quiet=TRUE), silent=TRUE)
> if (is.null(attr(tmp,"class"))) {
> dateCols <- grep("[0-9][0-9]/[0-9][0-9]/20[01][0-9]",tmp)
> hdrDF <-
> data.frame(tmp[(dateCols-1)],tmp[dateCols],stringsAsFactors=FALSE)
> hdrDF$LotDate <- rep(hdrDF[1,2],length(hdrDF[,1])) ; hdrDF <-
hdrDF[-1,]
> hdrDF[1,1] <- tmp[(dateCols-2)][1]
> names(hdrDF) <- c(slotCol,"Date","LotDate")
> hdrDF[,slotCol] <- substring(hdrDF[,slotCol],
>
(regexpr("=",hdrDF[,slotCol])+2),
> nchar(hdrDF[,slotCol]))
> if (any(nchar(hdrDF[,slotCol])==0)) {
> print(paste("Header file",hdrFiles[i],
> "has no wafer information. Headers will not be
> included."))
> } else {
> otherCols <- tmp[grep("=",tmp)]
> otherCols <- otherCols[-grep("WAFER", otherCols,
ignore.case=TRUE)]
> otherData <-
substring(otherCols,(regexpr("=",otherCols)+2),
> nchar(otherCols))
> otherCols <-
substring(otherCols,1,(regexpr("=",otherCols)-2))
> otherData <-
as.data.frame(matrix(rep(otherData,length(hdrDF[,1])),
> ncol=length(otherCols),
> byrow=TRUE),stringsAsFactors=FALSE)
> names(otherData) <- otherCols ; hdrDF <- cbind(hdrDF,otherData)
> hdrDF$Date <- as.POSIXct(hdrDF$Date,format=dateFormat)
> hdrDF$LotDate <- as.POSIXct(hdrDF$LotDate,format=dateFormat)
> hdrDF$TestTime <- NA
> for (j in c(1:length(hdrDF[,1])-1)) {
> hdrDF$TestTime[j] <- hdrDF$Date[(j+1)]-hdrDF$Date[j]
> }
> eTestData <- merge(hdrDF,eTestData,by=slotCol)
> }
> }
> if (length(dataFiles) > 1) {
> for (i in c(2:length(dataFiles))) { # i <- 48
> # print(paste("I am at file #",i,",
named",dataFiles[i]))
> tmp <-
read.table(paste(dataDir,"/",dataFiles[i],sep=""),header
> TRUE,
> as.is = TRUE)
> if (names(tmp)[1] != "Wafer") {
> if (length(names(tmp)) == length(dataHeaders)) {
> print(paste("File",dataFiles[i],"is missing header
information."))
> print(" 'Typical' headers will be used.")
> tmp <-
read.table(paste(dataDir,"/",dataFiles[i],sep=""),
> header = FALSE, as.is = TRUE)
> names(tmp) <- dataHeaders
> } else {
> print(paste("File",dataFiles[i],"is missing header
information
> and"))
> print(" has a non-standard set of data. It will not be
> included.")
> next
> } # end of "if" whether the num of cols of the dataset is
standard
> } # end of "if" whether the data headers are missing
> tmp[,slotCol] <- as.character(tmp[,slotCol])
> tmp[,lotCol] <- rep(dataFiles[i],length(tmp[,1]))
> ### if (useHeaders) {
> tmp2 <-
try(scan(paste(dataDir,"/",hdrFiles[i],sep=""),
> what = "character",sep="\n",
quiet=TRUE),silent=TRUE)
> if (is.null(attr(tmp2,"class"))) {
> dateCols <-
grep("[0-9][0-9]/[0-9][0-9]/20[01][0-9]",tmp2)
> hdrDF <- data.frame(tmp2[(dateCols-1)],tmp2[dateCols],
> stringsAsFactors=FALSE)
> hdrDF$LotDate <- rep(hdrDF[1,2],length(hdrDF[,1]))
> flag <- 1 # This is the flag to warn that the headers are not
> correct
> if ((dateCols[2] - dateCols[1]) > 2) { # This is to ensure there
are
> full headers
> hdrDF <- hdrDF[-1,]
> hdrDF[1,1] <- tmp2[(dateCols-2)][1]
> flag <- 0 # The flag is turned off if the headers are correct
> }
> names(hdrDF) <- c(slotCol,"Date","LotDate")
> hdrDF[,slotCol] <- substring(hdrDF[,slotCol],
>
(regexpr("=",hdrDF[,slotCol])+2),
> nchar(hdrDF[,slotCol]))
> if (flag) {
> print(paste("Header file",hdrFiles[i], "has no
wafer
> information."))
> print(" Headers will not be included.")
> } else {
> otherCols <- tmp2[grep("=",tmp2)]
> otherCols <-
otherCols[-grep("WAFER",otherCols,ignore.case=TRUE)]
> otherData <-
substring(otherCols,(regexpr("=",otherCols)+2),
> nchar(otherCols))
> otherCols <-
substring(otherCols,1,(regexpr("=",otherCols)-2))
> otherData <-
> as.data.frame(matrix(rep(otherData,length(hdrDF[,1])),
>
> ncol=length(otherCols),byrow=TRUE),
> stringsAsFactors=FALSE)
> names(otherData) <- otherCols
> hdrDF <- cbind(hdrDF,otherData)
> } # end the "if" if it was flagged for bad headers
> hdrDF$Date <- as.POSIXct(hdrDF$Date,format=dateFormat)
> hdrDF$LotDate <- as.POSIXct(hdrDF$LotDate,format=dateFormat)
> ## In calculating "TestTime" below, I am assuming that
the "Date" is
> ## the time the wafer BEGAN processing. E.g., therefore I will not
> ## know the test time for the last wafer in the lot.
> hdrDF$TestTime <- NA
> for (j in c(1:length(hdrDF[,1])-1)) {
> hdrDF$TestTime[j] <- hdrDF$Date[(j+1)]-hdrDF$Date[j]
> }
> tmp <- merge(hdrDF,tmp,by=slotCol)
> } # end the "if" in case the header file was missing
> eTestData <- merge(tmp,eTestData,all = TRUE)
> } # end of the loop through all data files
> } # end of the "if" statement to see if there is more than 1
data file
> eTestData <- eTestData[order(eTestData$Date),]
> names(eTestData)[grep(slotCol,names(eTestData))] <- "Slot"
> lotCol2 <- which(names(eTestData) == lotCol)
> eTestData <-
> eTestData[,c(lotCol2,setdiff(c(1:length(eTestData)),lotCol2))]
> eTestData
> }
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> 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.
>
>
--
Spencer Graves, PE, PhD
President and Chief Operating Officer
Structure Inspection and Monitoring, Inc.
751 Emerson Ct.
San Jos?, CA 95126
ph: 408-655-4567