Как проверить, передается ли переменная в функцию с кавычками или без них? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь написать функцию R, которая может принимать в качестве параметра имя переменной фрейма данных в кавычках или без кавычек или вектор имен переменных.Проблема заключается в том, что когда пользователь вставляет имена столбцов данных без кавычек в качестве входных параметров функции, это приводит к «объект не найден» ошибка .Как я могу проверить, указано ли имя переменной в кавычках?

Я пробовал существует (), отсутствует (), подстановить (), но ни одна из них не работает для всех комбинаций.


# considering this printfun as something I can't change 
#made it just for demosnstration purposeses
printfun <- function(df, ...){
  for(item in list(...)){
    print(df[item])
  }

}
myfun<-function(df,x){

  #should check if input is quoted or unquoted here 

  # substitute works for some cases not all (see below)
  new_args<-c(substitute(df),substitute(x))
  do.call(printfun,new_args)

}
#sample data
df<-data.frame(abc=1,dfg=2)

#these are working
myfun(df,c("abc")) 
myfun(df,c("abc","dfg"))
myfun(df,"abc")

#these are failing with object not found
myfun(df,abc)
myfun(df,c(abc))

Я могу различить myfun(df,abc) и myfun(df,"abc") с помощью блока try Catch.Хотя это выглядит не очень аккуратно.

Но я не нашел способа отличить второй аргумент в myfun(df,c(abc)) от myfun(df,abc)?

В качестве альтернативы, могу ли я как-то проверить, еслиошибка возникает из-за пропущенных кавычек, так как я предполагаю, что объект не найден. Ошибка может возникать также из-за того, что что-то еще (например, имя информационного кадра) было напечатано неправильно?

1 Ответ

0 голосов
/ 16 мая 2019

Похоже, что это работает для всех ваших дел:

myfun<-function(df,x){

  sx <- substitute(x)
  a <- tryCatch(is.character(x), error = function(e) FALSE)
  if (a) {
      new_x <- x
  } else {
      cx <- as.character(sx)
      if (is.name(sx)) {
          new_x <- cx
      } else if (is.call(sx) && cx[1] == "c") {
          new_x <- cx[-1]
      } else {
          stop("Invalid x")
      }
  }
  new_args <- c(substitute(df), as.list(new_x))
  do.call(printfun, new_args)
}

Однако я чувствую, что в том, что вы пытаетесь сделать, есть что-то странное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...