R(その他)

2024年1月26日 (金)

[R]ベクトルやデータフレームをファイルに保存し、後で読み込んで再利用する

saveRDS関数を使うことで、オブジェクト(ベクトルやデータフレームなど)をファイルに保存することができる。このファイルに保存した内容は、後(Rの再起動後も可)でreadRDS関数を使ってその環境に読み込み再利用することができる。save関数と異なり、一つのオブジェクトしか保存することができず、readRDS関数で読み込む際は、その読み込み先のオブジェクトを指定する必要がある。

> rm(list = ls(all.names = TRUE))
> ls()
character(0)
> no <- c(30, 58, 64)
> name <- c("ライスシャワー", "メイショウドトウ", "メジロパーマー")
> seiyu <- c("石見舞菜香", "和多田美咲", "のぐちゆり")
> meibo <- data.frame(no, name, seiyu)
> print(meibo)
no name seiyu
1 30 ライスシャワー 石見舞菜香
2 58 メイショウドトウ 和多田美咲
3 64 メジロパーマー のぐちゆり
> saveRDS(meibo, file = "meibo.rds")
> rm(list = ls(all.names = TRUE))
> ls()
character(0)
> readRDS(file = "meibo.rds")
no name seiyu
1 30 ライスシャワー 石見舞菜香
2 58 メイショウドトウ 和多田美咲
3 64 メジロパーマー のぐちゆり
> ls()
character(0)
> dtf <- readRDS(file = "meibo.rds")
> ls()
[1] "dtf"
> print(dtf)
no name seiyu
1 30 ライスシャワー 石見舞菜香
2 58 メイショウドトウ 和多田美咲
3 64 メジロパーマー のぐちゆり

saveRDS関数はデフォルトではファイルをgzip圧縮をする。ファイルサイズは小さくなるが、その分、保存時も読み込み時も時間がかかることに注意。

2024年1月25日 (木)

[R]ベクトルやデータフレームをファイルに保存し、後で読み込んで再利用する

save関数を使うことで、複数のオブジェクト(ベクトルやデータフレームなど)をファイルにまとめて保存することができる。このファイルに保存した内容は、後(Rの再起動後も可)でload関数を使ってその環境に読み込んで再利用することができる。読み込み時は保存時のベクトル名などがそのまま使用される。保存するファイルの拡張子は以下の例のとおり「RData」とするのが無難。

> rm(list = ls(all.names = TRUE))
> no <- c(30, 58, 64)
> name <- c("ライスシャワー", "メイショウドトウ", "メジロパーマー")
> seiyu <- c("石見舞菜香", "和多田美咲", "のぐちゆり")
> dtf <- data.frame(no, name, seiyu)
> print(dtf)
no name seiyu
1 30 ライスシャワー 石見舞菜香
2 58 メイショウドトウ 和多田美咲
3 64 メジロパーマー のぐちゆり
> lis <- list(no, seiyu)
> print(lis)
[[1]]
[1] 30 58 64
[[2]]
[1] "石見舞菜香" "和多田美咲" "のぐちゆり"
> ls()
[1] "dtf" "lis" "name" "no" "seiyu"
> save(dtf, lis, file = "test.RData")
> rm(list = ls(all.names = TRUE))
> ls()
character(0)
> load("test.RData")
> ls()
[1] "dtf" "lis"
> print(dtf)
no name seiyu
1 30 ライスシャワー 石見舞菜香
2 58 メイショウドトウ 和多田美咲
3 64 メジロパーマー のぐちゆり
> print(lis)
[[1]]
[1] 30 58 64
[[2]]
[1] "石見舞菜香" "和多田美咲" "のぐちゆり"

load関数で読み込まれたベクトルなどと同じ名前のベクトルなどが既にその環境下にある場合は、上書きされてしまうことに注意。

> rm(list = ls(all.names = TRUE))
> ls()
character(0)
> dtf <- data.frame(no = 1:3)
> print(dtf)
no
1 1
2 2
3 3
> load("test.RData")
> ls()
[1] "dtf" "lis"
> print(dtf)
no name seiyu
1 30 ライスシャワー 石見舞菜香
2 58 メイショウドトウ 和多田美咲
3 64 メジロパーマー のぐちゆり

save関数はデフォルトでファイルをgzip圧縮をするため、ファイルサイズは小さくなるが、その分、保存時も読み込み時も時間がかかることに注意。

2024年1月24日 (水)

[R]SQL Serverのデータベースを作成する

RODBCパッケージを使う。以下はSQL Server(インスタンス名:SQLEXPRESS)が稼働しているサーバーで、自身のサーバのSQL Serverに接続してprincessというデータベースを作成した例。接続はWindows認証を前提としている。作成に成功すると何も表示されないが、以下のように失敗すると(既に作成済みのデータベースを作成しようとしている)、エラーメッセージが返される。

> library(RODBC)
> drv <- "driver={SQL Server}"
> srv <- "server=localhost\\sqlexpress"
> s <- paste(drv, srv, sep = ";")
> dc <- odbcDriverConnect(s)
> r <- sqlQuery(dc, "create database princess")
> print(r)
character(0)
> r <- sqlQuery(dc, "create database princess")
> print(r)
[1] "42000 1801 [Microsoft][ODBC SQL Server Driver][SQL Server]データベース 'princess' は既に存在します。別のデータベース名を選択してください。"
[2] "[RODBC] ERROR: Could not SQLExecDirect 'create database princess'"

select文を使い、作成したデータベースを確認してみる。

> r <- sqlQuery(dc, "select name, database_id, create_date from sys.databases")
> print(r)
name database_id create_date
1 master 1 2003-04-08 09:13:36
2 tempdb 2 ○○-○-○ ○:○:○
3 model 3 2003-04-08 09:13:36
4 msdb 4 2019-09-24 14:21:42
5 princess 5 ○○-○-○ ○:○:○

master、tempdb、model、msdbはSQL Serverインストール時に自動作成されるシステムのデータベース。princessデータベースが作成されていることがわかる。

2023年12月16日 (土)

[R]動作環境の設定を確認する

options関数を使う。戻り値はリストのため、個々の値を直接確認するには、名前を指定する。

> options()
$add.smooth
[1] TRUE
$askYesNo
function (msg, ...)
{
(以下、表示省略)
> str(options())
List of 69
$ add.smooth : logi TRUE
$ askYesNo :function (msg, ...)
(以下、表示省略)
> class(options())
[1] "list"
> options()$digits
[1] 7

2023年10月 7日 (土)

[R]エラーメッセージ「invalid multibyte character in parser」

source関数を実行したときに、ファイルの文字コードを正しく指定していない場合、このエラーメッセージが表示される。encodingオプションに文字コードを正しく指定すればよい。以下の例では、PowerShellで文字コードをシフトJISにしたスクリプトを作成し、それを実行してみる。

PS > @'
>> cat("ABC123あいう\n")
>> '@ | Out-File -Encoding default temp.R
PS > Format-Hex .\temp.R
パス: ○○○
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 63 61 74 28 22 41 42 43 31 32 33 82 A0 82 A2 82 cat("ABC123‚ ‚¢‚
00000010 A4 5C 6E 22 29 0D 0A ¤\n")..
> Get-Content .\temp.R
cat("ABC123あいう\n")

Rでスクリプトを動作させてみる。以下のRの環境下では、Sys.getlocale関数の戻り値のとおり、文字コードはUTF-8である。

> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"
> source("temp.R")
エラー: invalid multibyte character in parser (temp.R:1:12)
> source("temp.R", encoding = "SJIS")
ABC123あいう

2023年10月 6日 (金)

[R]R起動時に使用できる文字コードを自動的に設定する

Windowsの日本語版Rの起動時の文字コードは長らくシフトJISであったが、バージョン4.2以降はUTF-8に変わった。R起動時に使用できる文字コードを自動的にシフトJISに変更したい場合は、.RProfileファイルを使用する。

バージョン4.2以降は、デフォルトの文字コードはUTF-8。0x82a0(シフトJISで「あ」)を表示してみる。

'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。
'help.start()' で HTML ブラウザによるヘルプがみられます。
'q()' と入力すれば R を終了します。
> rawToChar(as.raw(c(0x82, 0xa0)))
[1] "\x82\xa0"

表示されない。文字コードはシフトJIS以外であることがわかる。

Rはスタートメニューのアイコンから起動する場合は、フォルダーC:\Users\○○○\Documentsの.RProfileを自動的に読み込む。テキストエディタで作成し、以下の1行を追加してRを再起動してみる。

Sys.setlocale(locale = "Japanese_Japan.932")
'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。
'help.start()' で HTML ブラウザによるヘルプがみられます。
'q()' と入力すれば R を終了します。
[1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"
警告メッセージ:
Sys.setlocale(locale = "Japanese_Japan.932") で:
using locale code page other than 65001 ("UTF-8") may cause problems
>

コンソールの最初の表示が変わる。文字コードを確認してみる。

> rawToChar(as.raw(c(0x82, 0xa0)))
[1] "あ"

環境下の文字コードがシフトJISであることがわかる。

.RDataファイルをダブルクリックしてRを起動している場合は、その.RDataファイルと同じフォルダーに置かれた.RProfileを自動的に読み込むため、テキストエディタで作成し、上記と同様にその1行を追加してRを再起動すればよい。

2023年9月12日 (火)

[R]文字コードを指定してスクリプトを実行する

source関数は、指定したスクリプトファイルを読み込んで実行するが、そのファイルの文字コードが実行環境と同じでない場合は実行することができない。以下は、UTF-8の環境下で、文字コードがシフトJISの以下のようなスクリプトファイル(exec_sjis.Rと保存)を読み込んでコマンドを実行した例。

d <- sum(1:100)
cat(sprintf("1から100まで足した合計 %d\n", d))

実行してみる。

> R.version.string
[1] "R version 4.3.0 (2023-04-21 ucrt)"
> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"
> source("exec_sjis.R")
エラー: invalid multibyte character in parser (exec_sjis.R:2:15)
> source("exec_sjis.R", encoding = "SJIS")
1から100まで足した合計 5050

2023年7月11日 (火)

[R]WebサイトのHTTP応答ヘッダーを表示する

curlGetHeaders関数を使う。以下は首相官邸のWebサイトのHTTP応答ヘッダーを読み込んで表示した例。

> curlGetHeaders("https://www.kantei.go.jp")
[1] "HTTP/1.1 200 OK\r\n"
[2] "Content-Type: text/html\r\n"
[3] "Content-Length: 34079\r\n"
[4] "Connection: keep-alive\r\n"
[5] "x-amz-id-2: 5WwFUp70CdeHuaZnA6D4JHd6TMOLP+rMlDThFyJyK0L36Ef56JmQBErMN9ykfOxqDFTsOL2fMKfTFT86HK1t5A==\r\n"
[6] "x-amz-request-id: XS0PB5HEJW6JWJ34\r\n"
[7] "x-amz-replication-status: COMPLETED\r\n"
[8] "Last-Modified: Fri, 16 Jun 2023 11:47:26 GMT\r\n"
[9] "x-amz-server-side-encryption: AES256\r\n"
[10] "x-amz-version-id: jWmosSt3Co6lQohIyEfv7ei_AOH7v3MI\r\n"
[11] "Accept-Ranges: bytes\r\n"
[12] "Server: none\r\n"
[13] "Date: Fri, 16 Jun 2023 12:11:03 GMT\r\n"
[14] "ETag: \"f82848ddba52d80055f6700388dca50a\"\r\n"
[15] "X-Cache: Hit from cloudfront\r\n"
[16] "Via: 1.1 9d4586c3d96c296deb0177ba3471c4a4.cloudfront.net (CloudFront)\r\n"
[17] "X-Amz-Cf-Pop: NRT57-P3\r\n"
[18] "X-Amz-Cf-Id: 85ur58h0Nu7ZeEYeAkB1z6jq1tsUH9E1gVDRSb_rOPsfU0Z_F4g62Q==\r\n"
[19] "Age: 25\r\n"
[20] "X-Frame-Options: SAMEORIGIN\r\n"
[21] "\r\n"
attr(,"status")
[1] 200

2023年5月 1日 (月)

[R]環境変数を取得する

Sys.getenv関数を使う。

> Sys.getenv("HOMEDRIVE")
[1] "C:"
> Sys.getenv("COMSPEC")
[1] "C:\\Windows\\system32\\cmd.exe"

2023年4月22日 (土)

[R]WebサイトのWebページをダウンロードする

rvestパッケージのread_html関数を使う。

> library(rvest)
> s <- read_html("https://mainichi.jp")
> print(s)
{html_document}
(以下、表示省略)

プロキシ等の設定で、以下のようなエラーが発生して実行できない場合がある。

> s <- read_html("https://mainichi.jp")
open.connection(x, "rb") でエラー:
Timeout was reached: [○○] Connection timeout after ○○ ms

このような場合は、download.file関数を利用した以下のような関数を自作する。read_html関数による戻り値と全く同じ戻り値が得られる。

read_html2 <- function(urlname) {
filename <- tempfile()
download.file(urlname, destfile = filename)
return(read_html(filename))
}

実行してみる。

> library(rvest)
> read_html2 <- function(urlname) {
+ filename <- tempfile()
+ download.file(urlname, destfile = filename)
+ return(read_html(filename))
+ }
> s <- read_html2("https://mainichi.jp")
URL 'https://mainichi.jp' を試しています
downloaded 163 KB
> print(s)
{html_document}
(以下、表示省略)

より以前の記事一覧

無料ブログはココログ

■■

■■■