R_Primitive のバックアップ(No.3) - アールメカブ

アールメカブ


R_Primitive のバックアップ(No.3)


Rの備忘録

演算子と呼ばれる関数群がある. Software for Data Analysis: Programming with R に第6章に詳しい.

たとえば 1 + 2 のという式で,引数の真ん中に書いて使える + のような関数である.

> `+` # ` はシフトを押しながら @ を押す
function (e1, e2)  .Primitive("+")

既存のデータフレームに要素を追加する時は`$<-.data.frame` が呼ばれる.この定義は以下の通り.

> `$<-.data.frame`
function (x, i, value) 
{
  cl <- oldClass(x)
  class(x) <- NULL
  nrows <- .row_names_info(x, 2L)
  if (!is.null(value)) {
    N <- NROW(value)
    if (N > nrows) 
      stop(gettextf("replacement has %d rows, data has %d", 
          N, nrows), domain = NA)
    if (N < nrows && N > 0L) 
      if (nrows%%N == 0L && length(dim(value)) <= 1L) 
          value <- rep(value, length.out = nrows)
     else stop(gettextf("replacement has %d rows, data has %d", 
           N, nrows), domain = NA)
     if (is.atomic(value)) 
         names(value) <- NULL
   }
   x[[i]] <- value
   class(x) <- cl
   return(x)
}
<environment: namespace:base>

ところが,data.frame() は,長いのでざっとみただけだが,オブジェクトのクラス判定なども行っているようだ.

> data.frame
function (..., row.names = NULL, check.rows = FALSE,
 check.names = TRUE, stringsAsFactors =default.stringsAsFactors())
...
else if (inherits(xi1, "Date") || inherits(xi1, 
                 "POSIXct")) 
         xi[[j]] <- rep(xi1, length.out = nr)
...

RjpWiki初心者 Q&A に strptime() で作成したリスト(ベクトルではない)を既存の data.frame の要素として追加できないという話題がある.POSIXlt をそのまま代入しようとしても,これはリストであり,その要素数は 9 のリストなのでエラーとなる.

> (t <- strptime(paste("1-1-2001 9", 1:20, sep=":"),
             "%m-%d-%Y  %H:%M"))
> d1 <- data.frame(a=1:20)
> d1$b <- t
以下にエラー `$<-.data.frame`(`*tmp*`, "b", value = list(sec =
 c(0, 0, 0,  : 
replacement has 9 rows, data has 20