問題タブ [non-standard-evaluation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
430 参照

r - 変数入力が文字列か記号かを判断できる dplyr 関数の作成

dplyr関数を使った関数を作りたいので「dplyrでプログラミング」ビネットを勉強しています。私が作成した関数を、光沢のあるアプリケーションとインタラクティブな R 作業の両方で使用したいと考えています。Shiny で使用するには、これらの関数が文字列引数を取り、sym 関数を使用してそれらをシンボルに変換するようにしたいと考えています。インタラクティブなセッションで使用するために、これらの関数に文字列を使用しなくてもよいオプションが必要です。したがって、私が作成する関数には、特定の引数が文字列かどうかを判断する方法が必要になります。

私はこれへの方法を考え出しました。それを行うためのより良いおよび/またはよりエレガントな方法があるかどうか、私はただ興味があります。

例として、「my_summarise」という単純な関数を作成しました。これは、ビネットとは異なるバージョンの関数「my_summarise」です。これは、tryCatch を使用して、group_var 引数が文字列かどうかを確認します。

編集:Onyambuの答えは完璧です. 基本的な同等の関数の代わりに、いくつかの rlang 関数を使用するように微調整しました。

0 投票する
1 に答える
885 参照

r - 光沢のある入力から関数に dplyr フィルター条件を渡す

サイドバー メニューを使用して条件の任意のリストによってデータフレームをフィルター処理できるようにする、Shiny アプリで使用する一般的な関数を作成しようとしています。そのため、サイドバー メニューを使用して、フィルタリングする列とフィルタリングする条件の両方を選択できます。

これは、mtcars データセットを使用して、現在私の目的のために機能する、作成した Rmd の再現可能な例を縮小したものです。

https://github.com/keithmcnulty/flexfiltering/blob/master/index.Rmd

非標準評価では、列名を値とは異なる方法で処理する必要があるため、使用して構築された関数filter1_by、などを参照してください。これにより、必要なフィルターの数に応じて、いくつかの関数を作成する必要がありました。例えば:filter2_bydplyr::filter_at

私が本当にやりたいことはfilter_by(df, ...)、任意のフィルター条件のセットを受け入れる単一の関数を作成することです。次に例を示します。

コーディング方法についてアドバイスをいただければ幸いですfilter_by

ありがとう!

0 投票する
2 に答える
559 参照

r - dplyr() の非標準評価と準引用符が (単純に) 期待どおりに機能しない

"derived_name"以下の再現可能な例では、データベースを検索し、元の検索から派生した名前で出力にラベルを付けようとしています。dplyrpipeを使用してい%>%ますが、quasiquotation および/または非標準評価に問題があります。具体的には、最終関数でcount_colnameから派生した文字オブジェクトであるを使用すると、データフレームのサブセット化に失敗します。"derived_name"top_n()

この議論に基づいて、上記のコードが機能すると思いました。そして、この投稿は私を試してみるように導きましたがtop_n_()、これは存在しないようです。

私はvignette("programming")頭を少し超えていることを勉強しています。この投稿により、機能する構文を試すようになりました!! sym()が、理由がわかりません! 以下のコードが機能する理由を理解するのに役立ちます。ありがとう。

以下の@lionelと@Tungの質問とコメントに基づく追加の紛らわしい例。ここで私を混乱させているのは、ヘルプファイルがsym()「文字列を入力として受け取り、それらをシンボルに変換する」および!!「その引数の引用符を外す」と言っていることです。ただし、以下の例では、 はsym(count_colname)引用符を外しているように見えますderived_name_letr_count。と が同じ値を与えるため、 で!!が必要な理由がわかりません。!! sym(count_colname)sym(count_colname)qq_show(!! sym(count_colname))

0 投票する
2 に答える
152 参照

r - 関数内の動的選択式

このデータ フレームを変換する関数を作成しようとしています。

このデータフレームに

しかし、関数が任意の数の列で機能できるようにしたいと考えています。したがって、S1、S2、S3、S4 がある場合、または追加のカテゴリ、つまり DS1、DS2 がある場合にも機能します。理想的には、関数は、どの列が互いに積み重ねられるかを決定するパターン、各列のセットの数、出力列の名前、および保持する必要がある変数の名前を引数として受け取ります。

これは、この関数での私の試みです:

sel_funこのように一定数のパターンでパーツを機能させることができます

しかし、私が試した動的バージョンは機能せず、次のエラーが発生します。

0 投票する
0 に答える
57 参照

r - 条件が FALSE のときに高価な関数を呼び出さないように if/else 構造をベクトル化しましたか?

バックグラウンド

dplyr パイプラインの一部である別の関数内から呼び出される、計算コストの高い (およびSLOW ) 関数があります。

Typeこの関数は、変数(文字列) が「男性」または「女性」のどちらに一致するかによって、2 つのいずれかを実行します。一致する場合はnative_last_name_alpha、計算コストが高く遅い関数が実行され、他の処理が実行されます。一致しない場合は、native_last_name_alphaを返しNAます。現在、これはベクトル化されているため、何が起こるべきかを判断するためにif_elseandを使用しcase_whenています。たとえば、次のようになります。

TRUE問題は、条件がまたはに評価されるかどうかに関係なく、高価な関数が実行されるFALSEことです。これにより、スクリプトの実行が非常に遅くなります。

if_else、ifelse、および case_when を深く掘り下げる

ベクトル化された if/else ステートメントif_elseifelse(and case_when) は、従来の if...else ステートメントのようには機能しないことを理解しています。ステートメントのすべての部分が評価され、次に条件を使用して、返される結果がつなぎ合わされます。たとえば、このコードは次の出力と警告を生成します。

[1] 2 1 1 2

警告メッセージ:

1: ifelse(v > 0, log10(v), log10(-v)) : 生成された NaN

2: ifelse(v > 0, log10(v), log10(-v)) の場合: NaN が生成される

条件が true の場合の戻り値と条件が false の場合の戻り値の両方が評価され、条件を使用して結果のベクトルが結合されます。

その結果、高価で遅い関数が実際に必要な回数よりも多く実行されています。

どうすればこれを回避できますか?

私が欲しいもの

私は、条件が true の場合に true の場合のみ結果を評価するif_elseandの代替のベクトル化された実装を探しています。case_when

これまでに試したこと

if_else/の独自のベクトル化された実装を作成しようとしましifelseたが、成功しませんでした。非標準評価も試しましたが、これを機能させるのに十分な知識がありません。if_else評価されていない式を返すことができ、後で適切なタイミングで評価することができれば(フリーズドライ関数呼び出しのようなもの)、これが解決策の一部になる可能性があると推測しています。しかし、今のところ喜びはありません。

やりたいことを簡単にするために見逃したことはありますか?または、誰かが実装に関するヒントを提供できますか? ありがとう!