2

I created a data table df

library(data.table)
df <- data.table(id = c(1,1,1,2,2), starts = c(0,0,6,0,9), ends = c(0,6,10,9,20))

df
   #id starts ends
#1:  1      0    0
#2:  1      0    6
#3:  1      6   10
#4:  2      0    9
#5:  2      9   20

I defined a function 'equal_0', which is entering a col_name, then the function would return a data table with that col_name == 0

equal_0 <- function(col_name){
    a <- df[col_name == 0]
    return(a)
}

For example, equal_0(starts) equals to df[starts == 0], the expected result is:

df[starts==0]
   #id starts ends
#1:  1      0    0
#2:  1      0    6
#3:  2      0    9

However, both equal_0(starts) and equal_0("starts") don't work.

The error message is:

equal_0("starts")
#Empty data.table (0 rows) of 3 cols: id,starts,ends

equal_0(starts)
#Error in eval(.massagei(isub), x, parent.frame()) : object 'starts' not found 

How can I pass starts into the function equal_0?

pogibas
  • 27,303
  • 19
  • 84
  • 117
Harold
  • 373
  • 2
  • 12
  • Related: [Referring to data.table columns by names saved in variables](https://stackoverflow.com/questions/16617226/referring-to-data-table-columns-by-names-saved-in-variables) – Henrik Oct 14 '17 at 18:25

1 Answers1

2

Use get to extract column from the data.table:

equal_0 <- function(col_name){
    library(data.table)
    a <- df[get(col_name) == 0]
    return(a)
}
equal_0("starts")
   id starts ends
1:  1      0    0
2:  1      0    6
3:  2      0    9
pogibas
  • 27,303
  • 19
  • 84
  • 117