Краткая версия: Как функция может различать получение этих двух входов?

value <- "asdf"
"asdf"

Воспроизводимый пример: Скажем, у меня есть функция, которая ищет зло или, по крайней мере, строку "evil"

library(stringr)

Find_Evil <- function(x) {
  x <- str_to_lower(x)
  if(str_detect(x, "evil")) {
    message("Evil detected")
  } else {
    return(x)
  }
}

Функция отлично работает при обнаружении присутствия "evil" на своем входе.

Find_Evil("this has some evil in it")
Evil detected

Что если я также хочу определить, есть ли в имени переменной evil или нет? Это проходит, когда не должно.

sneaky_evil <- "sounds good but isn't"
Find_Evil(sneaky_evil)
[1] "sounds good but isn't"

Я могу проверить имя переменной, используя deparse(substitute()), но как мне проверить, является ли переменная первой? То, что я хотел бы, это что-то вроде мета-кода ниже ( не работает ):

Find_Evil <- function(x) {
  x <- str_to_lower(x)
  if (x is a variable) { # this is the part I need help on
    x_name <- str_to_lower(deparse(substitute(sneaky_evil))) # convert value name to string
    evil_name <- str_detect(x_name, "evil") # check name for evil
    evil_x <- str_detect(x, "evil") # check contents for evil
    if (sum(evil_name, evil_x) != 2) { # if either name or contents contains evil
      message("evil detected")
    } else {
      return(x)
    }
  } else {
    if (str_detect(x, "evil")) { # if x isn't a variable just check x (no name)
      message("Evil detected")
    } else {
      return(x)
    }
  }
3
Greg 11 Апр 2020 в 18:03

2 ответа

Лучший ответ

Возможно, что-то подобное поможет:

Find_Evil <- function(x) {
   var_type <- substitute(x)
   var_name <- deparse(substitute(x))
   if(grepl('evil', var_name) & is.name(var_type)) {
     return("evil detected in variable")
   }
   x <- tolower(x)
   if(grepl('evil', x)) {
     return("Evil detected in string")
   }
   else return(x)
}

sneaky_evil <- "sounds good but isn't"
Find_Evil(sneaky_evil)
#[1] "evil detected in variable"

sneaky_only <- "sounds good but isn't"
Find_Evil(sneaky_only)
#[1] "sounds good but isn't"

sneaky_only <- "sounds good but evil"
Find_Evil(sneaky_only)
#[1] "Evil detected in string"

Find_Evil("sounds good but isn't")
#[1] "sounds good but isn't"

Find_Evil("sounds good but evil")
#[1] "Evil detected in string"
2
Ronak Shah 12 Апр 2020 в 01:08

Мы можем использовать

library(stringr)
Find_Evil <- function(x) {
   var_name <- deparse(substitute(x))
   if(str_detect(var_name, "evil")) {
     return("evil detected in variable")
   }
   x <- tolower(x)
   if(str_detect(x, 'evil')) {
     return("Evil detected in string")
   }
   else return(x)
 }

sneaky_evil <- "sounds good but isn't"
Find_Evil(sneaky_evil)
#[1] "evil detected in variable"

sneaky_only <- "sounds good but isn't"
Find_Evil(sneaky_only)
#[1] "sounds good but isn't"


sneaky_only <- "sounds good but evil"
Find_Evil(sneaky_only)
#[1] "Evil detected in string"
1
akrun 11 Апр 2020 в 15:20