これは、StackOverflow に関する私の最初の質問投稿です。プロトコル エラーがあれば修正してください。しかし、私はサイトの他の多くの質問への回答からすでに大きな恩恵を受けているので、先に進む前に、サイトに貢献しているコミュニティに感謝したいと思います.
概要
R、RStudio、およびパッケージdevtools
をroxygen2
Windows 7マシンで使用しています(session_info
質問の最後に完全に記載されています)
SpatialLines
packageから S4 クラスのサブクラスを定義し、 packagesp
も使用する独自のパッケージを作成しようとしていますrgeos
。document
私の問題は、
load_all
自分のパッケージに devtools を使用したときに、よくわからず、完全に解決できない警告メッセージに関連しています。
警告メッセージ
最初のメッセージは
class "Spatial" is defined (with package slot ‘sp’) but no metadata object found to revise subclass information---not exported? Making a copy in package ‘minweSpatialNULL’
これを解決すると、NAMESPACE ファイルにエントリを追加して (なぜそれが必要なのかを完全には理解せずに)、DESCRIPTION ファイルにさらに変更を加えると、2 番目のメッセージが表示されます。
d> devtools::document()
Updating minweSpatialNULL documentation
Loading minweSpatialNULL
Error: class "SpatialLinesNULL" is not exported by 'namespace:rgeos'
私が試したこと、および私が残した質問
ヒントを求めていくつかのサイトをグーグルで検索しましたが、最も近いものは、SpatialLinesNULL がどこから来たのかを尋ねる 2011 年 12 月の短いスレッドでしたrgeos
。
http://lists.r-forge.r-project.org/pipermail/rspatial-devel/2011-December/000033.html
私は自分で何が悪いのかを理解するために実験を試み、何が起こっているのかを理解するのに十分なほど深く理解することができなかったので、道に迷うまでデバッガーでコードをステップ実行しました。その過程で、問題の小さな (そうではない) 実例が生成されました。これを以下に示します。
3 つの質問があります。それらはここに要約されていますが、実際には、以下の(実際には動作していない)おもちゃの例のコンテキストでのみ意味があります。
- 質問 1
Spatial
(test1 の後)とにかくR が (仮想?) スーパークラスを必要とするのはなぜですかMyClass2
。
明確化の追加@importClassesFrom
R のパッケージ化名前空間メカニズムは、実際に使用するクラスを編集した後、前件/スーパークラスを見つけてアクセスする必要があると考えていました。 - 質問 2 (test3 の後) 最初の警告メッセージの理由が何であれ、この同様のメッセージの理由でもあると思います。
私は正しい軌道に乗っていますか? - 質問 3 (test4 の後) test3 からの警告とそれに続くこのエラーは、自分で解決できるものですか?
rgeos
それとも、パッケージの管理者に助けを求める必要がありますか(例: export を依頼するなどSpatialLinesNULL
)?
コード例
私のおもちゃの作業例のrコード(スペースを節約するためにroxygenコメントのみを取り除いたもの)は次のとおりです。
MyClass1 <- setClass('MyClass1', contains = c('SpatialLines'))
MyClass2 <- setClass('MyClass2', contains = c('MyClass1'))
MyClass2 の第 2 世代のサブクラスは重要なようです (それがなければ警告は消えます)。私はなぜなのか理解していない。
devtools
と を使用し
て、このコードで一連のテストを実行しましたroxygen2
。テストは、NAMESPACE ファイルの内容と、DESCRIPTION ファイルの Imports ディレクティブの内容によって異なります。テストの実行は、RStudio での実行devtools::load_all()
(または途中devtools::document()
での呼び出し) で構成されます。load_all()
発生する警告メッセージは上記に掲載されています。各テストの間にクリーンなグローバル環境で R セッションを再起動します (警告は、load_all
またはを最初に実行したときにのみ発生しますdocument
)。
以下の回答をフォローアップしているときに、シェルコマンドラインからRを使用しておもちゃのパッケージをビルドおよびインストールする必要があることに気付きました。
テスト1
test1 には DESCRIPTION ファイルのエントリがあります (完全な DESCRIPTION ファイルについては、この質問の最後を参照してください)。
Imports:
methods,
sp
完全な NAMESPACE ファイル (上で省略した roxygen コメントから生成) は次のとおりです。
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
再起動した R セッションで実行devtools::load_all()
(またはdevtools::document()
) しようとすると、最初の警告が生成されます (上記を参照)。
質問 1 R が ~~(virtual?)~~ スーパークラスを必要とするのはなぜですか?コードで Spatial
第 2 世代が定義されている場合にのみ、なぜですか? 明確化の追加R のパッケージ化名前空間メカニズムは、実際に使用するクラスを編集した後、前件/スーパークラスを見つけてアクセスする必要があると考えていました。MyClass2
@importClassesFrom
テスト2
test2は、警告メッセージが示すように NAMESPACE ファイルを更新することで問題を解決します。他の変更は行われませんでした。
完全な NAMESPACE ファイルが次の場合、警告は消えます。
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(sp,Spatial)
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
テスト3
ただし、DESCRIPTION ファイルの Imports ディレクティブに 1 つの小さな変更を加えると、明らかに同様の問題が再発しますrgeos
。これは、test2 から test3 シナリオを作成するために行われた唯一の変更です。
Imports:
methods,
sp,
rgeos
これで、test1 の問題のような警告が表示されます。つまり、次のようになります。
class "SpatialLinesNULL" is defined (with package slot ‘rgeos’) but no metadata object found to revise subclass information---not exported? Making a copy in package ‘minweSpatialNULL
私が知る限り、SpatialLinesNULL
は の新しいスーパークラスでありSpatial
、 で定義されrgeos
ているため、いくつかの汎用関数とメソッドを提供できます。
質問 2最初の警告メッセージの理由が何であれ、それがこの同様のメッセージの理由でもあると思います。
私は正しい軌道に乗っていますか?
テスト4
test4では、test2 で行ったのと同じ解決策を適用しようとしています。つまり、欠落しているエントリを NAMESPACE ファイルに追加します。これは、test4 の完全な NAMESPACE ファイルです。
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(rgeos,SpatialLinesNULL)
importClassesFrom(sp,Spatial)
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
どの段階で、最終的なエラーメッセージが表示されます:
d> devtools::document()
Updating minweSpatialNULL documentation
Loading minweSpatialNULL
Error: class "SpatialLinesNULL" is not exported by 'namespace:rgeos
この段階で私は立ち往生しています。
質問 3 test3 からの警告とそれに続くこのエラーは、自分で解決できるものですか? rgeos
それとも、パッケージの管理者に助けを求める必要がありますか(例: export を依頼するなどSpatialLinesNULL
)?
session_info (test4 から)
d> devtools::session_info()
Session info --------------------------------------------------------------------------
setting value
version R version 3.1.2 (2014-10-31)
system x86_64, mingw32
ui RStudio (0.98.953)
language (EN)
collate English_Australia.1252
tz Australia/Sydney
Packages ------------------------------------------------------------------------------
package * version date source
devtools * 1.7.0.9000 2015-02-20 local
lattice * 0.20-29 2014-04-04 CRAN (R 3.1.2)
minweSpatialNULL * 0.0.0.9000 <NA> local
Rcpp * 0.11.4 2015-01-24 CRAN (R 3.1.2)
rgeos * 0.3-8 2014-09-21 CRAN (R 3.1.2)
roxygen2 * 4.1.0.9001 2015-02-21 local
rstudio * 0.98.953 2014-08-02 local
rstudioapi * 0.2 2014-12-31 CRAN (R 3.1.2)
sp * 1.0-17 2015-01-08 CRAN (R 3.1.2)
stringr * 0.6.2 2012-12-06 CRAN (R 3.1.1)
d>
test4 の完全なファイル
R/myclasses.r
#------------------------------------------------------------------------------
#' MyClass1
#'
#' A subclass of SpatialLines
#'
#' MyClass1 is a subclass of sp::SpatialLines.
#' @importClassesFrom sp SpatialLines Spatial
#' @importFrom sp SpatialLines
#' @importClassesFrom rgeos SpatialLinesNULL
MyClass1 <- setClass('MyClass1', contains = c('SpatialLines'))
#------------------------------------------------------------------------------
#' MyClass2
#'
#' A subclass of MyClass1
#'
#' MyClass2 is a subclass of MyClass1 and a 2nd generation subclass of
#' sp::SpatialLines.
#' @importClassesFrom sp SpatialLines
MyClass2 <- setClass('MyClass2', contains = c('MyClass1'))
説明ファイル
Package: minweSpatialNULL
Title: Minimum Example of my Problem with SpatialLinesNULL
Version: 0.0.0.9000
Authors@R: person("Geoff", "Lee", , "geoff.lee@gmail.com", role = c("aut", "cre"))
Description: (Hopefully) demonstrates my problem with warnings
that I cannot seem to eradicate.
Depends: R (>= 3.1.2)
Imports:
methods,
sp,
rgeos
License: GPL (>= 2.0)
LazyData: true
名前空間ファイル
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(rgeos,SpatialLinesNULL)
importClassesFrom(sp,Spatial)
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
結論
提供できるヘルプ、アドバイス、またはガイダンスを事前に感謝します。たとえそれが私がより良い質問をする方法についてであっても:-)