R 寄せ集め

R言語関係のサンプルコードや情報の寄せ集めです。まとまったら別投稿に分けるかも知れません。

# 組み込みデータセットを取得する

```r
data(package="datasets")
```

# 変数の名前や式のテキストからクラスを取得する

```r
class_from_text <- function(text) {
  class(eval(parse(text=text)))
}

x <- 0
class_from_text("x")
# [1] "numeric
```

# 変数の名前や式のテキストからクラスの継承を判定する

```r
inherits_for_text <- function(text, what, which=FALSE) {
  inherits(eval(parse(text=text)), what=what, which=which)
}

x <- 0
inherits_for_text("x", "numeric") # FALSE
inherits_for_text("x", "integer") # TRUE
```

# dplyr、purrr、stringrなどをまとめてインストールする

```r
install.packages("tidyverse", dependencies=TRUE)
```

# 文字列の先頭から最初の半角スペースまでを抜き出す。
```r
require(stringr)

str_extract("ab cd", "\\S*") # "ab"
str_extract(" cd", "\\S*")   # ""
str_extract(" ", "\\S*")     # ""
str_extract("", "\\S*")      # ""
```

# 変数の名前や式のテキストからクラスを取得する

```r
x <- 0
class(eval(parse(text="x")))
```

# 組み込みデータセットの名前を取得する

```r
require(purrr)
require(stringr)

get_data_names <- function(package=NULL) {
  data(package=package)$results[,"Item"] %>%
    purrr::map_chr(~str_extract(., "\\S*"))
}
get_data_names("datasets")
```

```plaintext:出力抜粋
  [1] "fruit"                 "sentences"             "words"                 "AirPassengers"         "BJsales"              
  [6] "BJsales.lead"          "BOD"                   "CO2"                   "ChickWeight"           "DNase"                
 [11] "EuStockMarkets"        "Formaldehyde"          "HairEyeColor"          "Harman23.cor"          "Harman74.cor"   
```

# 組み込みデータセットの名前とクラスを取得する。

## データフレームとして取得する。

`class()`が2つ以上の型名を返したデータセットは型名の数だけデータセットの名前が追加されます。

```r
require(purrr)
require(stringr)

get_data_names <- function(package=NULL) {
  data(package=package)$results[,"Item"] %>%
    purrr::map_chr(~str_extract(., "\\S*"))
}

class_from_text <- function(text) {
  class(eval(parse(text=text)))
}

get_data_names("datasets") %>%
  purrr::map_df(~data.frame(name=., class=class_from_text(.)))
```

```plaintext:出力抜粋
                     name          class
1                   fruit      character
2               sentences      character
3                   words      character
4           AirPassengers             ts
5                 BJsales             ts
6            BJsales.lead             ts
```

## 名前付きリストとして取得する。

```r
require(purrr)
require(stringr)

get_data_names <- function(package=NULL) {
  data(package=package)$results[,"Item"] %>%
    purrr::map_chr(~str_extract(., "\\S*"))
}

class_from_text <- function(text) {
  class(eval(parse(text=text)))
}

names <- get_data_names("datasets")
names %>%
  purrr::map(class_from_text) %>%
  purrr::set_names(names)
```

```plaintext:出力抜粋
$AirPassengers
[1] "ts"

$BJsales
[1] "ts"

$BJsales.lead
[1] "ts"

$BOD
[1] "data.frame"

$CO2
[1] "nfnGroupedData" "nfGroupedData"  "groupedData"    "data.frame"    
```

# 組み込みデータセットのクラスを取得する。

```r
require(purrr)
require(stringr)

get_data_names <- function(package=NULL) {
  data(package=package)$results[,"Item"] %>%
    purrr::map_chr(~str_extract(., "\\S*"))
}

class_from_text <- function(text) {
  class(eval(parse(text=text)))
}

get_data_names("datasets") %>%
  purrr::map(class_from_text) %>%
  purrr::flatten_chr() %>%
  unique
```

```plaintext:出力
 [1] "character"      "ts"             "data.frame"     "nfnGroupedData" "nfGroupedData"  "groupedData"    "mts"           
 [8] "matrix"         "table"          "list"           "array"          "dist"           "numeric"        "factor"    
```

- 注意
    - `purrr::map_chr(~class(eval(parse(text=.))))`を使用すると`class()`が2つ以上の文字列を返したときにエラーが発生します。
    - 一度`purrr::map(~class(eval(parse(text=.))))`でリストを取得した後、`purrr::flatten_chr()`でベクトルに戻します。

# tsクラスのデータセットの名前を取得する。

```r
require(purrr)
require(stringr)

get_data_names <- function(package=NULL) {
  data(package=package)$results[,"Item"] %>%
    purrr::map_chr(~str_extract(., "\\S*"))
}

inherits_for_text <- function(text, what, which=FALSE) {
  inherits(eval(parse(text=text)), what=what, which=which)
}

get_data_names("datasets") %>%
  purrr::keep(~inherits_for_text(., "ts"))
```

```plaintext:出力
 [1] "AirPassengers"  "BJsales"        "BJsales.lead"   "EuStockMarkets"
 [5] "JohnsonJohnson" "LakeHuron"      "Nile"           "Seatbelts"     
 [9] "UKDriverDeaths" "UKgas"          "USAccDeaths"    "WWWusage"      
[13] "airmiles"       "austres"        "co2"            "discoveries"   
[17] "fdeaths"        "freeny.y"       "ldeaths"        "lh"            
[21] "lynx"           "mdeaths"        "nhtemp"         "nottem"        
[25] "presidents"     "sunspot.month"  "sunspot.year"   "sunspots"      
[29] "treering"       "uspop" 
```