简体   繁体   中英

Pass column names as argument into a function

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 ?

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

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