почему deparse (заменитель (x)) не выбирает имя 'x' - PullRequest
0 голосов
/ 05 июня 2018

Мне было интересно, почему deparse(substitute(x)) для моего xlab не ставит имя x для xlab, как ожидалось ( см. Рисунок ниже )?

gg <- function(x, xlab = deparse(substitute(x)), ylab = NA, freq = FALSE, ...) { 
    x <- round(x)
    ylab <- if(is.na(ylab) & freq) {
        "Frequency" 
    } else if(is.na(ylab) & !freq) {
        "Probability" 
    } else ylab
    z <- if(freq) table(x) else table(x)/length(x)
    plot(z, xlab = xlab, ylab = ylab, ...)
}

# Example of use:
gg(mtcars$gear)    # 'mtcars' is a base R built-in dataset

enter image description here

1 Ответ

0 голосов
/ 05 июня 2018

Причина в ленивой оценке.(Не просите меня объяснить детали, пожалуйста. Это сложно, и вы можете изучить это с помощью определения языка . Но в основном, x изменяется до оценки xlab.) Вы можете исправитьэто легко с помощью force:

gg <- function(x, xlab = deparse(substitute(x)), ylab = NA, freq = FALSE, ...) {
  force(xlab)
  x <- round(x)
  ylab <- if(is.na(ylab) & freq) "Frequency" else if(is.na(ylab) & !freq) "Probability" else ylab
  z <- if(freq) table(x) else table(x)/length(x)
  plot(z, xlab = xlab, ylab = ylab, ...)
}
# Example of use:
gg(mtcars$gear)

resulting plot

...