動作するコード:duration
およびperiod
オブジェクト
次のコードは、duration
オブジェクトとperiod
オブジェクトをそれぞれ正常に生成します。
> lubridate::as.duration(1)
[1] "1s"
> lubridate::seconds(1)
[1] "1S"
動作しないコード:duration
およびsperiod
内のオブジェクトtibble
ただし、またはオブジェクトtibble
を使用してを作成しようとすると、情報が得られないエラー メッセージが表示されます。duration
period
> tibble::tibble(y = lubridate::as.duration(1))
Error: Incompatible duration classes (Duration, numeric). Please coerce with `as.duration`.
> tibble::tibble(y = lubridate::seconds(1))
Error in x < 0 : cannot compare Period to Duration:
coerce with 'as.numeric' first.
動作するコード:duration
およびsperiod
内のオブジェクトdata.frame
tibble::tibble
作品と交換base::data.frame
。
> data.frame(y = lubridate::as.duration(1))
y
1 1s
> data.frame(y = lubridate::seconds(1))
y
1 1S
動作しないコード - これらdata.frame
の s を強制するtibbles
これらの stibble::as_tibble
を強制的に使用すると、以前と同じエラーが発生します。data.frame
tibbles
> tibble::as_tibble(data.frame(y = lubridate::as.duration(1)))
Error: Incompatible duration classes (Duration, numeric). Please coerce with `as.duration`.
> tibble::as_tibble(data.frame(y = lubridate::seconds(1)))
Error in x < 0 : cannot compare Period to Duration:
coerce with 'as.numeric' first.
考えられる説明
Hadley は、この Github の問題 ( https://github.com/tidyverse/tibble/issues/326as.duration
) で、とを含む S4 列について言及していますas.period
。非互換性については特に言及されていません。
ソースコードを掘り下げると、同じエラーメッセージを表示する次の依存関係のチェーンが見つかりました。as_tibble.data.frame --> list_to_tibble --> new_tibble
ではtibble:::list_to_tibble
、 に渡される唯一の引数tibble::new_tibble
は ですx
。したがって、 にsubclass
は のデフォルト値が割り当てられ、NULL
の最後から 2 番目の行は次のようにtibble::new_tibble
なります。
class(x) <- c("tbl_df", "tbl", "data.frame")
オブジェクトには構造がありますが、それらを直接呼び出そうとするとエラーが発生します。
> x <- data.frame(y = lubridate::as.duration(1))
> class(x) <- c("tbl_df", "tbl", "data.frame")
> str(x)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 1 variable:
$ x:Formal class 'Duration' [package "lubridate"] with 1 slot
.. ..@ .Data: num 1
> x
Error: Incompatible duration classes (Duration, numeric). Please coerce with `as.duration`.
> x <- data.frame(y = lubridate::seconds(1))
> class(x) <- c("tbl_df", "tbl", "data.frame")
> str(x)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 1 variable:
$ y:Formal class 'Period' [package "lubridate"] with 6 slots
.. ..@ .Data : num 1
.. ..@ year : num 0
.. ..@ month : num 0
.. ..@ day : num 0
.. ..@ hour : num 0
.. ..@ minute: num 0
> x
Error in x < 0 : cannot compare Period to Duration:
coerce with 'as.numeric' first.
その結果、data.frame
x
ベクトルのクラスを割り当てると、エラーをスローする方法で強制しようとするようです。c("tbl_df", "tbl", "data.frame")
R
x
さらに、tibble::tibble
も呼び出すことを考えるとas_tibble
( ではありませんがdata.frame
)、私の問題tibble::tibble
が同じ原因であると推測する危険があります。
パッケージのバージョン
- ティブル: 1.4.1
- 潤滑剤: 1.7.1
- R: 3.4.3