R_Primitive の変更点 - アールメカブ

アールメカブ


R_Primitive の変更点


[[Rの備忘録]]

演算子と呼ばれる関数群がある.
&htmlinsert(amazontext,asin=0387759352,text=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初心者:http://www.okada.jp.org/RWiki/?%A3%D1%A1%F5%A3%C1%20%28%BD%E9%B5%E9%BC%D4%A5%B3%A1%BC%A5%B9%29%2F11#v0f6a18c]] 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
はダメだけど、
 > d1$b <- data.frame(t)$t
 なら大丈夫.

------------ 

と書いて放っておいたら,何気なく R 関係のホームページをみていたら,[[ここ:http://r-de-r.cocolog-nifty.com/blog/2009/09/posixlt-7952.html]] に以下のように書いてあった.


 d1 <- data.frame(d1, t) とすればよいようですよ。

この人のサイトのページをみてたら,初心者への私の回答態度が悪いと,怒られていた.すんません.