Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function: save returned data frame to workspace

Tags:

function

r

I cannot really get my head around this problem:

I have a function that returns a data frame. However, the data frame is only printed in my console although I would like to have it stored in the work space. How can I achieve this?

Sample data:

n <- 32640
t <- seq(3*pi,n)
data_sim <- 30+ 2*sin(3*t)+rnorm(n)*10
data_sim <- floor(data_sim)

Function:

compress <- function (name, SR){
  ## -------------------------------------------------------
  ## COMPRESSION
  library(zoo)
  data <- get(name)
  if (is.data.frame(data)==F){
    data = as.data.frame(data)
  }
  SR <- SR
  acrossmin <- 60  
  a <- nrow(data) 
  m <- acrossmin*SR*60  
  data_compress <- matrix(NA, nrow = a/m) 
  no_mov_subset <- matrix(NA, nrow = m) 
  for (i in 1:(a/m)){
    subset <- data[(((i-1)*m)+1):((i*m)),] 
    b <- length(subset)
    for (k in 1:b){
      r <- subset[k]
      if (r == 0){              
        no_mov_subset[k] <- 0    
      } else {
        no_mov_subset[k] <- 1
      }
      sum_no_mov_subset <- sum(no_mov_subset) 
      data_compress[i] <- sum_no_mov_subset  
    }
   colnames(data_compress) <- c("activity_count")
return(data_compress)
}

Run the code:

compress("data_sim", 4/60)

Obviously, the function returns something, but I would like it to be stored in the workspace rather than returned!

like image 622
Christine Blume Avatar asked Mar 14 '23 19:03

Christine Blume


1 Answers

Instead of the return command you can use

data_compress <<- data_compress

This way, the data frame is stored in the workspace. So your function looks like this:

compress <- function (name, SR){
  ## -------------------------------------------------------
  ## COMPRESSION
  library(zoo)
  data <- get(name)
  if (is.data.frame(data)==F){
        data = as.data.frame(data)
  }
  SR <- SR
  acrossmin <- 60  
  a <- nrow(data) 
  m <- acrossmin*SR*60  
  data_compress <- matrix(NA, nrow = a/m) 
  no_mov_subset <- matrix(NA, nrow = m) 
  for (i in 1:(a/m)){
        subset <- data[(((i-1)*m)+1):((i*m)),] 
        b <- length(subset)
        for (k in 1:b){
              r <- subset[k]
              if (r == 0){              
                    no_mov_subset[k] <- 0    
              } else {
                    no_mov_subset[k] <- 1
              }
              sum_no_mov_subset <- sum(no_mov_subset) 
              data_compress[i] <- sum_no_mov_subset  
        }
        colnames(data_compress) <- c("activity_count")
        data_compress <<- data_compress
  }
}

Edit: As commented by Heroka and hrbrmstr, this solution is not safe. It is better to assign the output of the function call to a variable:

data_compr <- compress("data_sim", 4/60)
like image 116
RomanB Avatar answered Mar 17 '23 14:03

RomanB