5

動作するコード:durationおよびperiodオブジェクト

次のコードは、durationオブジェクトとperiodオブジェクトをそれぞれ正常に生成します。

> lubridate::as.duration(1)
[1] "1s"

> lubridate::seconds(1)
[1] "1S"

動作しないコード:durationおよびsperiod内のオブジェクトtibble

ただし、またはオブジェクトtibbleを使用してを作成しようとすると、情報が得られないエラー メッセージが表示されます。durationperiod

> 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.frametibbles

> 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")Rx

さらに、tibble::tibbleも呼び出すことを考えるとas_tibble( ではありませんがdata.frame)、私の問題tibble::tibbleが同じ原因であると推測する危険があります。

パッケージのバージョン

  • ティブル: 1.4.1
  • 潤滑剤: 1.7.1
  • R: 3.4.3
4

1 に答える 1

3

この問題は、ピラー v.1.2.1 ( https://github.com/r-lib/pillar/issues/88 ) で解決されました。

于 2018-03-12T00:12:28.943 に答える