eval 関数の使い方

eval 関数を利用することで、文字列として部分をそのまま R のスクリプトに変換して実行させることができる。eval の使用例をいくつかここに示す。

パッケージのリロード

eval 関数は与えられた文字列を R のスクリプトとして解釈する。そのため、library(package-name) などの文字列を用意して eval 関数に与えれば、パッケージの呼び出しを行うことができる。

libs <- c("DESeq", "edgeR", "ggplot2")

eval(parse(text = paste0("library(", libs[1], ")")))  # paste0 関数で library("DESeq") 文字列を作る
eval(parse(text = paste0("library(", libs[2], ")")))  # paste0 関数で library("edgeR") 文字列を作る
eval(parse(text = paste0("library(", libs[3], ")")))  # paste0 関数で library("ggplot2") 文字列を作る

関数の実行

eval を利用して関数を呼び出して実行する方法。

f <- function(x) {return(x * x)}

eval(parse(text = "f(10)"))
## [1] 100

eval(parse(text = "f(100)"))
## [1] 10000

データのロード

d <- "iris"

eval(parse(text = paste0("data(", d, ")")))
eval(parse(text = paste0("head(", d, ")")))
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

リスト要素の取得

eval を利用して、リストの要素を取得する方法。

p <- list(
    a = c("alpha", "beta"),
    b = c(1, 3)
)
q <- list(
    a = c("gamma", "delta"),
    b = c(2, 4)
)

for (i in c("p", "q")) {
  for (j in c("a", "b")) {
    eval(parse(text = paste0("print(", i, "$", j, ")")))
  }
}
## [1] "alpha" "beta" 
## [1] 1 3
## [1] "gamma" "delta"
## [1] 2