Переименуйте переменную внутри функции в r, используя обычную оценку - PullRequest
0 голосов
/ 22 апреля 2020

Скажем, у вас есть следующая функция, которая сравнивает два типа столбцов данных друг с другом:

dataframe_test <- function(df1, df2) {

  varnames <- names(df1)[names(df1) %in% names(df2)]
  out <- data.frame(
             df1 = sapply(df1[,varnames], class),
             df2 = sapply(df2[,varnames], class)
             ) 
  out$Test <- ifelse(out$df1 == out$df2, " - ", "FLAG")

  return(out)

  }

Вот используемая функция:

iris2 <- iris

dataframe_test(iris, iris2)

                 df1     df2 Test
Sepal.Length numeric numeric   - 
Sepal.Width  numeric numeric   - 
Petal.Length numeric numeric   - 
Petal.Width  numeric numeric   - 
Species       factor  factor   - 

Как я могу go о переименовывать столбцы выходных данных этой функции (iris, iris2 в моем примере выше) так, чтобы они совпадали с именами входных кадров данных? Все, что я пробовал, вызывало ту или иную ошибку. Например,

out <- rename_(out, .dots = setNames(list(df1), new))
colnames(out) <- c(glue::glue("{df1}"), glue::glue("{df2}"), "Flag")

Но ничего не сработало ...

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Используйте deparse() и substitute(), чтобы превратить символ в строки:

dataframe_test <- function(df1, df2) {

  varnames <- names(df1)[names(df1) %in% names(df2)]
  out <- data.frame(
    df1 = sapply(df1[,varnames], class),
    df2 = sapply(df2[,varnames], class)
  ) 
  out$Test <- ifelse(out$df1 == out$df2, " - ", "FLAG")
  names(out) <- c(deparse(substitute(df1)), deparse(substitute(df2)), "Test")

  return(out)

}

iris2 <- iris

dataframe_test(iris, iris2)
#>                 iris   iris2 Test
#> Sepal.Length numeric numeric   - 
#> Sepal.Width  numeric numeric   - 
#> Petal.Length numeric numeric   - 
#> Petal.Width  numeric numeric   - 
#> Species       factor  factor   -

Создано в 2020-04-22 пакетом Представить (v0.3.0 )

1 голос
/ 22 апреля 2020

Мы можем использовать deparse и substitute, чтобы получить имя информационного кадра и ссылаться на имя столбца по позиции в ifelse.

dataframe_test <- function(df1, df2) {

   data1 <- deparse(substitute(df1))
   data2 <- deparse(substitute(df2))
   varnames <- names(df1)[names(df1) %in% names(df2)]
   out <- setNames(data.frame(sapply(df1[,varnames], class),
                sapply(df2[,varnames], class)), c(data1, data2))
   out$Test <- ifelse(out[[1]] == out[[2]], " - ", "FLAG")
   return(out)
}

dataframe_test(iris, iris2)

#                iris   iris2 Test
#Sepal.Length numeric numeric   - 
#Sepal.Width  numeric numeric   - 
#Petal.Length numeric numeric   - 
#Petal.Width  numeric numeric   - 
#Species       factor  factor   -
...