168  シンプルな書き方での演算(attach)

library(tidyverse)

dat <- tibble(
  num = 1:10,
  fac2 = rep(c("a","b"), 5),
  fac3 = rep(c("A","B","C"), 4)[1:10]
)

前の動画では、基本である、個数、和、平均の関数について説明しました。

ただ、一般的にtibbleなどからベクトルを取り出す$記号を利用したスクリプトは、

というところで、個人的にはお勧めできません。

ですので、この動画では$サインをなるべく使わずに書く方法についてご説明いたします。

方法1:attachを利用する方法

一つ前の動画では、平均を求めるのに、

sum(dat$num)/length(dat$num)
[1] 5.5

と記載していました。

ただ、dat$と何回も打つのは面倒なので、できれば、次のようにnumとだけ打つことでベクトルを呼び出せると便利です。

sum(num)/length(num) #エラーですね
Error in sum(num): invalid 'type' (closure) of argument

Environmentペーンの内容を少し覚えておいてください。

attach(dat) #とすると、ここ以降、dat$とかかなくてもOK

sum(num)/length(num)
[1] 5.5
num
 [1]  1  2  3  4  5  6  7  8  9 10
fac2
 [1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
fac3
 [1] "A" "B" "C" "A" "B" "C" "A" "B" "C" "A"
detach(dat) #これでattach効果が消える
sum(dat$num)/length(dat$num)
[1] 5.5
sum(num)/length(num) #エラー!
Error in sum(num): invalid 'type' (closure) of argument

簡単ですね?

ただ、detachを忘れたりするとエラーの原因になったり思わぬ動作を引き起こすケースがあります。具体的には。。

num <- 1000 #numという変数を使いたいので作成

100行くらいのスクリプト

attach(dat) #fac2を利用したい
The following object is masked _by_ .GlobalEnv:

    num
mean(num) #dat$numの平均を求めたつもり
[1] 1000

本当に求めたかったのは

mean(dat$num)
[1] 5.5
detach(dat)

いかがでしょうか?

このようなエラーが生じる可能性があるため、できればattach、detachは使わないようにしています

ただし、ネットで検索した場合によく使われる関数でもあるのでここで紹介しました。

次の動画では、attach, detachを使わないで計算する方法を解説いたします。