R_Primitive
演算子と呼ばれる関数群がある. 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
はダメだけど、
> d1$b <- data.frame(t)$t なら大丈夫.
と書いて放っておいたら,何気なく R 関係のホームページをみていたら,ここ に以下のように書いてあった.
d1 <- data.frame(d1, t) とすればよいようですよ。
この人のサイトのページをみてたら,初心者への私の回答態度が悪いと,怒られていた.すんません.
Link: R_old_tips2(1908d)
Rの備忘録(3944d)
Last-modified: 2009-11-21 (土) 18:41:07 (5432d)