« 2018年9月 | トップページ | 2018年11月 »

2018年10月31日 (水)

[R]TRUE,FALSEとT,Fの違い

TRUEとFALSEは、論理型データの定数であり予約語。一方、TとFは初期状態で定義されている論理型データの長さ1のベクトル。

TRUEとFALSEは変更することができない定数で、TとFは初期状態で存在するベクトルに過ぎないため、変更することは可能。そのため、論理式で使用するときは、TRUEとFALSEの使用を推奨する。

> TRUE; FALSE; T; F
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE
> class(TRUE)
[1] "logical"
> class(T)
[1] "logical"
> mode(TRUE)
[1] "logical"
> mode(F)
[1] "logical"
> TRUE <- 1
TRUE <- 1 でエラー:  代入の左辺が不正 (do_set) です
> T <- 1
> TRUE; FALSE; T; F
[1] TRUE
[1] FALSE
[1] 1
[1] FALSE
> class(T)
[1] "numeric"

2018年10月23日 (火)

[Visual Basic]文字列が数値に変換可能か否かを判定する

IsNumeric関数は、引数に与えられた文字列が数値に変換可能であればTrueを、変換不可能な文字列であればFalseを返す。

以下の6つの文字列は、いずれも数値に変換可能なため、Trueを返している。文字列の前後に空白があっても、変換可能であることがわかる。

Debug.Print(IsNumeric("3"))
Debug.Print(IsNumeric("3."))
Debug.Print(IsNumeric("3.2"))
Debug.Print(IsNumeric("+3.21"))
Debug.Print(IsNumeric("+3.2e10"))
Debug.Print(IsNumeric("  4  "))

True
True
True
True
True
True

以下の5つの文字列は、いずれも数値に変換不可能のため、Falseを返している。アルファベットや2つ以上のピリオドや符号(正数・負数を表す記号)が含まれているとFalseを返すことがわかる。また、指数を表す文字は「d」は使えないことがわかる。

Debug.Print(IsNumeric("3a"))
Debug.Print(IsNumeric("3 2"))
Debug.Print(IsNumeric("+3.21+"))
Debug.Print(IsNumeric("3.2.1"))
Debug.Print(IsNumeric("+3.2d10"))

False
False
False
False
False

2018年10月20日 (土)

[R]文字列が数値に変換可能か否かを判定する

文字列が数値に変換可能か否かを判定する関数は、Rには標準で搭載されていない。as.numeric関数は文字列を数値に変換することができるが、変換できない文字列を与えると警告を発生するとともにNAを返す。この仕様を利用して、変換可能か否かを判定する関数を作成する。

以下の自作関数isNumericは、引数で与えた文字列がas.numeric関数で数値に変換可能であればTRUE、そうでなければFALSEを返す。

isNumeric <- function(st) {
  return(!is.na(suppressWarnings(as.numeric(st))))
}

suppressWarnings関数が警告を抑制する。また、is.na関数でNAが返されたか否かの判定をしている。

2018年10月19日 (金)

[R]文字列で与えられた任意の式の値を求める

expression関数、eval関数、parse関数を組み合わせて使う。以下の例では、文字列"x ^ 4"(xの4乗)を式と見なしてxの関数とし、x = 2、x = 3におけるそれぞれx4の値を求めている。

> shiki <- expression(eval(parse(text = "x ^ 4")))
> f <- function(x) eval(shiki)
> f(2)
[1] 16
> f(3)
[1] 81

[R]任意の式の導関数の値を求める

expression関数、eval関数、D関数を組み合わせて使う。以下の例では、「x ^ 4」(xの4乗)を式と見なしてxの関数とし、関数f(x)とその導関数f'(x)のx = 3におけるそれぞれの値を求めている。関数f(x)=x4であり、その導関数を求める(微分をする)とf'(x) = 4x3となる。x = 3における関数f(x)と導関数f'(x)の値を求めている。

> shiki <- expression(x ^ 4)
> f <- function(x) eval(shiki)
> fp <- function(x) eval(D(shiki, "x"))
> f(3)
[1] 81
> fp(3)
[1] 108

手計算では、f(x) = 3×4 = 81、f'(x) = 4 × 33 = 4 × 27 = 108となる。結果は一致している。

2018年10月11日 (木)

[R]2つの時刻の時刻差を計算する

difftime関数を使用する。unitsオプションを使用することで、差の計算方法(何秒、何分、何時間など)を指定することができる。

以下の例では、tm1への代入後に、おおよそ10秒後にtm2への代入を行った。

> tm1 <- Sys.time()
> tm2 <- Sys.time()  # おおよそ10秒後に代入
> d <- difftime(tm2, tm1, units = "secs")
> d
Time difference of 10.08858 secs
> d <- difftime(tm2, tm1, units = "mins")
> d
Time difference of 0.168143 mins
> d <- difftime(tm2, tm1, units = "hours")
> d
Time difference of 0.002802383 hours

戻り値のモードは数値型。クラスはdifftime型。モードが数値型のため、戻り値の計算は簡単に行える。

> mode(d)
[1] "numeric"
> class(d)
[1] "difftime"
> d / 10
Time difference of 0.0002802383 hours

2018年10月 5日 (金)

[R]現在の時刻(年月日含む)を得る

現在の時刻(年月日含む)を得るには、Sys.time関数を使う。

> Sys.time()
[1] "2018-09-25 11:26:45 JST"

Sys.time関数は、その環境のタイムゾーン、現在の日付、現在の時刻の3つの情報を得る。

> mode(Sys.time())
[1] "numeric"
> class(Sys.time())
[1] "POSIXct" "POSIXt"

« 2018年9月 | トップページ | 2018年11月 »

無料ブログはココログ

■■

■■■