Передача аргументов функции без кавычек в i в data.table - PullRequest
1 голос
/ 08 ноября 2019

Я создаю функцию, позволяющую моим коллегам легко анализировать некоторые предварительно определенные наборы данных. Я хотел бы, чтобы они могли передавать аргументы «i» для выбора строк. Чтобы сделать его более надежным, я хотел бы иметь возможность передать этот аргумент с кавычками или без них.

Вот пример, который работает с кавычками…

x <- data.table(x = c(1,1,1,2,2,2,3,3,3), 
  sex = c("M", "M", "F","M", "F","M", "F","M", "F"))
test.function <- function(my.dt, ...){
  where <- parse(text = paste0(list(...))) 
  my.dt <- my.dt[eval(where), ]
  return(my.dt)
}
tmp <- test.function(x, 'x==3 | sex=="F"')
head(tmp) 

Если я удалю кавычки, произойдет сбой, сказав «объект« секс »не найден»…

x <- data.table(x = c(1,1,1,2,2,2,3,3,3), 
  sex = c("M", "M", "F","M", "F","M", "F","M", "F"))
test.function <- function(my.dt, ...){
  where <- parse(text = paste0(list(...))) 
  my.dt <- my.dt[eval(where), ]
  return(my.dt)
}
tmp <- test.function(x, x==3 | sex=="F")
head(tmp)

В дополнение к вышесказанному, у меня есть много неудачных попыток с использованием цитаты, подстановки и rlang: как этот неудачный пример ...

x <- data.table(x = c(1,1,1,2,2,2,3,3,3), 
                sex = c("M", "M", "F","M", "F","M", "F","M", "F"))
test.function <- function(my.dt, ...){
  where <- rlang::quos(...)
  my.dt <- my.dt[!!where, ]
  return(my.dt)
}
tmp <- test.function(x, 'x==3 | sex=="F"')
head(tmp, 10)

В дополнение к любым идеям для решений, я был бы признателен, если бы кто-то мог указать мнек онлайн-ресурсу простаков для понимания символов / выражений / цитат / и т. д. Когда я углубился в эту проблему, я понял, что у меня есть серьезные пробелы в моем понимании того, как работает R.

Кстати, я уже прочитал следующее, но ни один из них не смог мне помочь: Передача аргумента функции в data.table i и Передача нескольких аргументов в data.table внутри функции .

1 Ответ

1 голос
/ 09 ноября 2019

Могут быть и другие (лучшие) варианты, но вы можете заключить его в tryCatch и использовать bquote для аргумента без кавычек

test.function <- function(my.dt, ...){
    where <- tryCatch(parse(text = paste0(list(...))),  error = function (e) parse(text = paste0(list(bquote(...)))))
    my.dt <- my.dt[eval(where), ]
    return(my.dt)
  }

tmp <- test.function(x, 'x==3 | sex=="F"')
head(tmp) 
   x sex
1: 1   F
2: 2   F
3: 3   F
4: 3   M
5: 3   F

tmp <- test.function(x, x==3 | sex=='F')
head(tmp)
   x sex
1: 1   F
2: 2   F
3: 3   F
4: 3   M
5: 3   F
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...