Rを産業開発に使用する

これは、 以前の出版物の続きです。 Rが使用されるツールの中で言及されている場合、2番目に人気があるのは「産業開発」での使用の可能性の問題であることは秘密ではありません。 「Rとは何か」という質問は、常にロシアで掌握しています。







「産業」開発でRを使用する側面と可能性を理解してみましょう。









産業用ソフトウェア開発とは何ですか?



この用語によって誰もが自分自身の何かを理解することはまったく驚くことではありません。 「C ++のみ」または「javaのみ」で始まり、「10年前の販売計画とロードマップを持っている」で終わる。 しかし、用語の明確な定義がなければ、先へ進むことは不可能です。







一意に確立された定義がないため、この質問に答えるために、外部および内部の固有の成果物の組み合わせからこの概念を収集します。









マネージャーの観点から見ると、アーティファクトについてはすべて明確ですが、プログラミング言語とはあまり関係がありません。 非常に多くの内部成果物がありますが、それらの多くについては、どの言語が開発されているかは関係ありません。 特に、Rを使用する場合は、お気に入り/おなじみの中から使用できます。









したがって、主な苦情は信頼性のコンテキストで再定式化できます(「コンソールでのインタラクティブな作業は24時間年中無休であり、学術研究のためにすべてを書いたのです!」)。 発言は一般的に正しいですが、わずかに古いデータによると。 実際、Rは現在、24x7形式のアプリケーションを簡単かつエレガントに作成できるパッケージとアプローチのセットを形成しています。 したがって、開発中のソフトウェアの信頼性を確保するというタスクで最も興味深い点に焦点を当てます。









部分的に、これらのポイントは防御プログラミング領域と重なります。







また、Rは、データ操作の問題を解決するための高レベル言語であり、幅広い実績のあるライブラリ(パッケージ)を備えていることを忘れないでください。 非常に複雑なタスクに対するソリューションの内容でも、わずか数百行のコードで済みます。 大規模なプロジェクトの場合、独自のライブラリ(パッケージ)を作成してコードを構造化できるパッケージ化メカニズムを使用することが望ましいです。







さまざまなプログラミングパラダイムのサポート



既存のパッケージセットは、数学的アルゴリズムの観点だけでなく、開発パラダイムの観点でもbase-Rの機能を補完および拡張します。 整頓された世界を広げて、OOPと関数型プログラミングの実装を拡張する2つのパッケージに言及するのは理にかなっています。











関数型アプローチについて話す場合、パイプオペレーター%>%



と組み合わせてpurrr



パッケージにこのアプローチの個別の要素セットを実装すると、実際にデータ処理を大幅に簡素化および保護でき、これに必要なコード量が大幅に削減されます。 はじめに、このトピックに関する良いレポートを読むことができます: Happy R Users Purrr-チュートリアル







デバッグ



RStudioのデバッグ 」の記事で詳しく説明されている古典的なデバッグツールに加えて、次のあまり有用ではないツールに言及します。









静的コード分析



ここではすべてが非常に簡単です。 最も人気のあるツールは、 lintr @ CRANまたはlintr @ githubです。

LintrはRStudio IDEと統合されているため、繰り返さないように、詳細はLintrとRStudioブランチの統合にあります。







ランタイムロギングおよび分析



ロギング



論理的に重要なポイントでソフトウェア実行のプロセスをログに記録しますが、オーバーヘッドが追加されますが、適切な方法で編成することにより、開発したソフトウェアのその後のテクニカルサポートを提供するタスクが大幅に簡素化されます。 高レベルのRとコードのコンパクトさを考えると、常時有効なロギングでさえ、リソースの観点からオーバーヘッドではありません。







ロギングタスクには、 futile.loggerパッケージが最も便利です。 log4jのセマンティクスは多くの人によく知られており、新しいことを学ぶ必要はありません。 便利で便利なアドオン/拡張機能から、次のものを選びます。







  1. flog.appender(appender.tee(log_name))



    の形式のロガー構成を使用すると、ファイルとコンソールの両方への同時出力を含めることができます。
  2. base::paste



    代わりに、 glue::glue



    を使用して、変数の値を含む複雑な文字列を作成する方base::paste



    はるかに便利です。 たとえば、文字列paste0(" FROM", ch_db$table, "WHERE ", where_string, sep=" ")



    は、1つのglue(" FROM {ch_db$table} WHERE {where_string}")



    フォーマット文字列glue(" FROM {ch_db$table} WHERE {where_string}")



    ます。 グルーのベクトル化により、テーブル選択の印刷も1行になります。 詳細は、アナウンスグルー1.2.0に記載されています。
  3. capture.output(fun...)



    関数を使用して、stdoutの関数によってcapture.output(fun...)



    れたメッセージを表示できます。
  4. コマンドブロックの実行時間を表示するには、 tictocパッケージのtic()



    toc()



    関数を使用すると非常に便利です。 同時に、そのような構造の形式でロガーにflog.info(glue("Data query response time: {capture.output(toc())}"))



    関数をすぐに含めます: flog.info(glue("Data query response time: {capture.output(toc())}"))





リアルタイム検証



一般に、特に動的型付けを使用する言語では、特定の機能で処理するために受信したデータを確認するのが良い規則です。 良い方法では、検証は2つの段階に分けられるべきです:物理的な検証(必要なタイプのデータ)と論理的な検証(正しいタイプのデータの内容も確立された要件に従います)。 論理的チェックを完了する時間は、物理的よりも桁違いに長くなる可能性があります。 基本的な例-物理的検証の段階では、浮動小数点数のベクトルの入力を見て、論理的検証の段階では、ベクトルのすべての要素が非負であることがわかります。







Rにはこのためのすべてがあり、非常に良い選択があります。 最も興味深い、有望なパッケージについてのみ言及します。 物理的検証およびassertr



checkmate



、論理的validate









assertive



とは異なり、 checkmate



実装checkmate



最初に速度と最小限のオーバーヘッドに焦点を合わせていることcheckmate



素晴らしいことです。

よく、 qassert



を使用して正規表現のスタイルでコンパクトな検証ルールを記述する可能性qassert



非常に楽しいです。2行をチェックする典型的な機能をいくつかの文字の行に折りたたむことができるからです。







論理的検証の観点から-ここでは、誰もが彼にとって便利な方法を選択できます。 それはすべて、どの種類のデータが独立してまたはパイプラインで処理されているか、正確に何をチェックする必要があるかによって異なります。







プログラムロジックに必要なものに応じて、 TRUE/FALSE



条件への準拠を確認してからロジックを分岐するか、例外をスロー(アサート)できます。







例外処理



例外を生成するメカニズムは、データを操作する際に間違いなく便利であり、付随する情報の詳細な出力は、コンソールでのインタラクティブな作業中に非常に役立ちます。 ただし、ストリーミング実行に切り替えた場合、エラーが発生したときにプログラムを停止することはまったく不要であり、ハンドラーの作成時に診断メッセージを生成するさまざまな方法が疲れ始めます。

通常のtryCatch



メカニズムを使用した例外処理については、 Advanced RtryCatch



説明されています。 プログラムモードでのデータ処理に関して、より興味深く有用なのは、次の2つの拡張機能です。









これらの関数は両方とも、関数のpurrr



ファミリによってpurrr



パッケージに実装されています。 エラー/結果フィールドを含む標準化されたリストを関数から取得すると、ストリーム処理を中断せず、パイプラインの完了後に発生した例外とエラーを処理できます。 ベクトル処理中に0による除算が発生した場合、常にベルを鳴らして例外を発生させる必要はまったくなく、不正な要素にマークを付けて次へ進むだけで十分です。 このような例外処理のカプセル化により、数十行のコードの代わりに、データを処理するときに予期しない状況を考慮するように設計され、すべてを1つのラッパーに減らすことができます。 コードの削減、過度の変動の低減-より安定した結果。







safely



に使用する可能性については、RStudioブログ( Hadley Wickham +ドキュメンテーションによるpurrr 0.2.0)で簡潔かつ簡潔に説明されています。







機能テストと単体テスト



testthat



パッケージをtestthat



ます。 「testthat:入門」という記事から研究を開始し 、CRANとHadley Wickhamの本、および「Testing R Code」の本を続けることができます。 上記の規定を考えると、関数をassertive



からcheckmate



パッケージの関数に読み込むときに移行します。 自動テストは、パッケージと個々の機能の両方について記述できます。







パッケージングと自動化されたアセンブリ



私たちは単に存在するが、誰もがそれについて知っているわけではないと述べています。 アセンブリ、検証、ドキュメント化、検証などはすべて、RStudio IDEによって統合されています。 記事「パッケージの構築、テスト、配布」で簡単に説明されています。 すべては、優れたHadley Wickhamの本「R packages」に詳しく説明されていますusethis



ヘルパーパッケージusethis



するとusethis



場合がありusethis









特定のアプリケーションに必要なパッケージのスナップショットを作成できるpackrat



パッケージもあります。 これにより、システムにインストールされているパッケージからソフトウェア機能環境を独立させることができます。







ドキュメント生成システム



パッケージで利用できるものを単に記載していますが、誰もがそれについて知っているわけではありません。 roxygenに基づいて構築され、RStudio IDEと統合されています。

すべては、優れたHadley Wickhamの本「R packages」に詳しく説明されています







おわりに



現在、Rは非常に積極的に開発しています。 毎週、新しい便利な機能、パッケージ、アプローチ、または既存のものが改善されます。 データ処理に関連するタスクの場合、パブリケーションに示されているパッケージのセットにより、高速で安定したコンパクトな予測可能なコードをRに書き込むことができます。 1年前、これらのパッケージは少なかったので、2018年末になります-時間はわかります。







このような状況では、2年以上前のデータに基づいて言語とプラットフォームを使用する可能性または不可能性について結論を出すことは正しくありません。 少なくとも、現在の状態に慣れる必要があります。







速度については、いつものように、この質問は相対的です。 2日間の開発+ Rでの実行に10秒は、2週間の開発+ Javaでの実行に0.1秒よりはるかに短いです。 速度はコンテキストで議論する必要があります。 高速実行を必要とする関数の場合、 Rcppパッケージを適用することにより、Rの境界を越えずにC ++で実装できます。 機能の簡単な概要は、著者の記事の1つ「RをC ++で拡張する:Rcppの簡単な紹介」にも記載されています。







収集から視覚化まで、さまざまなデータ処理のためのタスクが増えています。 Rに注目してみませんか?







前の出版物- 「R、アスタリスクおよびワードローブ」








All Articles