2016-11-21 4 views
0

나는 do.call으로 속고있다. "plot"을 기반으로 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 

는 왜 do.call를 사용할 때 내가 얻을 모든 번호를 surpress하는 축 레이블을 제공해야한다는, 그것은 무엇입니까?

+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을 사용할 때 list 인수의 이름은 호출 된 함수의 인수 이름과 일치합니다. 따라서 축 레이블에 이름이없고 값 만 남았습니다. 그 시점에서 데이터가 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)을 입력하면 레이블은 ab입니다. 그러나 do.call 매직을 사용하는 경우 do.call(plot, list(x = a, y = b)plot(x = 1:2, y = 3:4)으로 확장되므로 레이블은 1:23:4입니다. 나는 당신의 예를 들어, 즉 data 매개 변수를 사용하여 수식 방법을 사용하는 것이 좋습니다 것 :해야

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