cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

🍭.Last.valueの話: 保存して欲しければまずは結果を見せな

Rでパイプ処理をしていると、「あ、今の結果をオブジェクトに保存しとけば良かった...。もう一回実行するのメンドクセ」、ということがしばしばある。

そんな時は直前の処理をやり直す必要はなくて、.Last.valueを使って対処することもできる。???。以下の例を見てもらうのがわかりやすいと思う。

例1

library(dplyr)
# 種も仕掛けもございません
is.object(x)
#   Error: object 'x' not found

# なんらかの処理をする
iris %>% 
  dplyr::select(Sepal.Length, Species) %>% 
  dplyr::filter(Species == "setosa") %>%
  dplyr::sample_n(3)
##    Sepal.Length Species
## 37          5.5  setosa
## 42          4.5  setosa
## 9           4.4  setosa
# 保存してないことに気がつく
.Last.value -> x
# 救済された気持ちになる
x
##    Sepal.Length Species
## 37          5.5  setosa
## 42          4.5  setosa
## 9           4.4  setosa

例2

library(ggplot2)
# ただプロットする
mtcars %>% ggplot(aes(mpg, disp)) + 
  geom_point()

# 今の図にレイヤーを追加したくなった
.Last.value + ggtitle("なんちゃら")
# 結果は省略。タイトルを追加した図が描画される

種明しではないし、多分Rの基礎なのだろうけど( 2016-01-12コメントより追記: 「R言語逆引きハンドブック」には掲載されているそうですと思ったけど手持ちの「R言語上級ハンドブック」にも「Rプログラミングマニュアル―Rバージョン3対応 (新・数理 工学ライブラリ―情報工学)」にも書かれていなかった)、.Last.valueは最後に評価された表現式の値を一時的に保存している。なので例のように、コードを実行した直後(次の関数なりを実行するまで)であればオブジェクトとして保存することができるようになっている。

df_iris <- iris
identical(df_iris, .Last.value)
## [1] TRUE
# 次の評価式が与えられると.Last.valueが更新される
dim(df_iris)
## [1] 150   5
identical(df_iris, .Last.value)
## [1] FALSE

オブジェクトとして保存して欲しい?まずは結果を見てからだ、という気構えを持った方には便利かもしれない。

Enjoy!