Why do I need to wrap `get` in a dummy function in a J` lapply` call?

I am looking to process columns by criteria such as class or general pattern matching with grep.

My first attempt did not work:

require(data.table)
test.table <- data.table(a=1:10,ab=1:10,b=101:110)
##this does not work and hangs on my machine
test.table[,lapply(names(test.table)[grep("a",names(test.table))], get)]

Ricardo Saporta notes in the answer that you can use this construct, but you should wrap getin a dummy function:

##this works
test.table[,lapply(names(test.table)[grep("a",names(test.table))], function(x) get(x))]

Why do you need an anonymous function?

(Preferred / cleaning method is done through .SDcols:)

test.table[,.SD,.SDcols=grep("a",names(test.table))]
test.table[, grep("a", names(test.table), with = FALSE]
+3
source share
3 answers

This is a function lapply, not really. data.tableIn the documentation lapply:

, , , (, bquote), . , FUN (X [[0L]],...), 0L . , , FUN sys.call match.call , . , , , , lapply (ll, function (x) is.numeric(x)) R 2.7.1 is.numeric.

re @Hadley @DWin:

EE <- new.env()
EE$var1 <- "I am var1 in EE"
EE$var2 <- "I am var2 in EE"

## Calling get directly
with(EE, lapply(c("var1", "var2"), get))
Error in FUN(c("var1", "var2")[[1L]], ...) : object 'var1' not found

## Calling get via an anonymous function
with(EE, lapply(c("var1", "var2"), function(x) get(x)))
[[1]]
[1] "I am var1 in EE"

[[2]]
[1] "I am var2 in EE"

with(EE, lapply(c("var1", "var2"), rm))
Error in FUN(c("var1", "var2")[[1L]], ...) : 
  ... must contain names or character strings

with(EE, lapply(c("var1", "var2"), function(x) rm(x)))
[[1]]
NULL

[[2]]
NULL

# var1 & var2 have now been removed
EE
<environment: 0x1154d0060>
+2

@Ricardo , , , , environment get, . lapply sys.parent(n) ( n = 0 ), .

test.table[,lapply(grep('a',names(test.table),value=TRUE), 
                    get, envir = sys.parent(0))]

( , )

+3

, data.table j() expression ( , DT[,...]) . DT[,"Column1"] "Column1", , with(DT, "Column1") "Column1" faq.

, :

DT[,names(test.table),with=F]
-1
source

Source: https://habr.com/ru/post/1540055/


All Articles