简体   繁体   中英

i don't think i understand function enclosures

I'm trying to package some code I use for data analysis so that other workers can use it. Currently, I'm stuck trying to write a simple function that imports data from a specific file type generated by a datalogger and trims it for use by other functions. Here's the code:

import<-function(filename,type="campbell",nprobes){
  if (filename==TRUE){
    if (type=="campbell"){
      message("File import type is from Campbell CR1000")
      flux.data<<-read.table(filename,sep=",",header=T,skip=1) 
      flux.data<<-flux.data[,-c(1,2)];flux.data<<-flux.data[-c(1,2),] 
      if (nprobes=="missing"){
        nprobes<-32
      }
      flux.data<<-flux.data[,c(1:nprobes)]
      flux.data.names<<-colnames(flux.data) #Saves column names
    }
  }
}

Ideally, the result would be a dataframe/matrix flux.data and a concomittant vector/list of the preserved column headers flux.data.names . The code runs and the function executes without errors, but the outputs aren't preserved. I usually use <<- to get around the function enclosure but its not working in this case - any suggestions?

I think the real problem is that I don't quite understand how enclosures work, despite a lot of reading... should I be using environment to assign environments within the function?

User joran answered my question in the comments above:

The critical issue was just in how the function was written: the conditional at the start ( if filename==TRUE ) was intended to see if filename was specified, and instead was checking to see if it literally equaled TRUE . The result was the conditional never being met, and no function output. Here's what fixed it:

import<-function(filename,type="campbell",nprobes){
  if (exists(filename){
    if (type=="campbell"){
#etc....

Another cool thing he pointed out was that I didn't need the <<- operator to utilize the function output and instead could write return(flux.data) . This is a much more flexible approach, and helped me understand function enclosures a lot better.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM