2016-11-21 8 views
0

Я обманываю с do.call.Понятия do.call семантика на основе «графика»

I = iris 
do.call(what = "plot", args = c(I$Sepal.Length ~ I$Sepal.Width)) 
# This seems fine 

p = list(x = I$Sepal.Length, y = I$Sepal.Width) 
do.call(what = "plot", args = p) 
# This looks weird 

p1 = list(x = I$Sepal.Length, y = I$Sepal.Width, xlab = "") 
do.call(what = "plot", args = p1) 
# A bit less weird 


p2 = list(x = I$Sepal.Length, y = I$Sepal.Width, xlab = "", ylab = "") 
do.call(what = "plot", args = p2) 
# And this gives the same as the first do.call 

Так почему же это, что я должен поставить метки осей для surpress всех этих цифр, которые я получаю при использовании do.call?

+0

@ZheyuanLi Это должно быть '' =!. Первый вызывает «plot.formula», последний «plot.default». Вот почему метки осей различаются. – Roland

+0

Нет, они относятся к меткам оси. Я сомневаюсь, что они даже заметили проблему переключения x и y. – Roland

+0

Я напишу ответ. – Roland

ответ

1

Что вы видите, это то, что R помещает на этикетках оси, когда он не может получить другую информацию об именах из аргументов. Если вы это сделаете:

plot(x=c(1,2,3,4,5,6,7,8),y=c(1,2,3,4,3,2,3,4)) 

Затем на графике будут использоваться векторные значения в качестве меток оси.

При использовании do.call имена в аргументах списка сопоставляются с именами аргументов вызываемой функции. Таким образом, для меток оси не осталось имен, а только значений. В этот момент факт, что данные пришли от I$Sepal.width, давно ушел, его просто вектор ценностей.

+0

Это был ответ, который я искал. Спасибо. –

3

Сначала вам нужно понять, что plot - это S3 generic, который вызывает методы в зависимости от первого параметра. Если вы делаете plot(y ~ x), этот метод равен plot.formula, а осевые метки выведены из формулы. Если вы делаете plot(x, y) (обратите внимание на разный порядок x и y), метод равен plot.default, а метки осей выводятся из символов, переданных как параметры.

Теперь, если вы делаете a <- 1:2; y <- 3:4; plot(x = a, y = b), наклейки a и b. Однако, если вы используете магию do.call, do.call(plot, list(x = a, y = b) получает расширение до plot(x = 1:2, y = 3:4), и поэтому этикетки 1:2 и 3:4. Я бы рекомендовал использовать метод формулы с параметром data, то есть, для примера:

do.call(what = "plot", args = list(formula = Sepal.Length ~ Sepal.Width, 
            data = I))