Это не специфичное для ggplot поведение, а более общий принцип: R REPL не печатает операторы присваивания вообще , тогда как для выражений он вызывает print()
или show()
в результирующее значение, в зависимости от типа объекта (см. раздел «Автопечать» R Internals для получения подробной информации). Например, 1
> 1 + 1 # expression
[1] 2
> x <- 1 + 1 # assignment
>
Для объекта ggplot вызов print
для объекта запускает рендеринг. Так что, если вы не назначаете, он отображается. Например,
> ggplot(mtcars, aes(hp, mpg)) + geom_point()

> g <- ggplot(mtcars, aes(hp, mpg)) + geom_point()
>
Функция plot
, с другой стороны, включает в себя рендеринг как часть этого, поэтому другая вызванная вами функция рендерится, несмотря на присваивание.
Обратите внимание, что можно использовать функцию invisible
, чтобы временно установить R_Visible
в FALSE
, что отключает поведение по умолчанию при печати выражений, но все равно подтолкнет полученный результат к .Last.value
.
> invisible(1 + 1)
> .Last.value
[1] 2
Однако, поскольку plot()
вызывает визуализацию графического устройства как часть его кода, invisible()
не остановит его от рендеринга.
> invisible(plot(mtcars$hp, mtcars$mpg))

[1] Кредит @ Грегор