问题标签 [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 投票
1 回答
112 浏览

r - R 评估函数参数的方式具有魔力

考虑以下 R 代码:

这行得通,但这里似乎有一些魔力。通常,当我们有一个类似的表达式时foo(bar),我们应该能够这样做:

但是,在提供的代码片段中,我们无法W == 1dplyr::filter()! W不是定义的变量。

这是怎么回事?

0 投票
2 回答
49 浏览

r - 将列表中的表达式捕获为文本

我目前有这个函数,它接受一个表和两个表达式列表,并对它们求值,将它们变成两个矩阵。我使用两个列表而不是...因为我需要能够确定表达式是落在 Y 还是 Z 中。

例如:

但是,我还想将列表中的表达式捕获为文本,因此我可以使用它们来命名列。例如,我想要的输出是这样的:

我怎样才能做到这一点?

0 投票
2 回答
430 浏览

r - 创建可以判断变量输入是字符串还是符号的 dplyr 函数

我一直在研究“使用 dplyr 编程”小插图,因为我想创建使用 dplyr 函数的函数。我想使用我在闪亮的应用程序和交互式 R 工作中创建的功能。为了在闪亮中使用,我希望这些函数采用字符串参数并使用 sym 函数将它们转换为符号。为了在交互式会话中使用,我希望这些函数可以选择不必使用字符串。所以我制作的函数需要一种方法来判断某些参数是否是字符串。

我想出了一个办法。我只是好奇是否有更好和/或更优雅的方式来做到这一点。

我做了一个简单的函数“my_summarise”作为例子。它是与小插图不同的函数“my_summarise”版本。它使用 tryCatch 来检查 group_var 参数是否为字符串。

编辑: Onyambu 的答案是完美的。我只是对其进行了调整以使用一些 rlang 函数而不是它们的基本等效函数。

0 投票
2 回答
784 浏览

r - 在 apply 的函数中使用 dplyr::group_by

我想为我的数据集中的一组分组变量生成漂亮的摘要,对于每个组,我将显示前 6 个频率及其相关比例。我可以使用以下语法为单个分组变量获取此信息:

我如何修改这个表达式,以便它可以在应用函数中使用?

例如使用 mtcars,我尝试过这样的事情:

但它不起作用。知道我怎么能做到这一点吗?

0 投票
1 回答
885 浏览

r - 将来自闪亮输入的 dplyr 过滤条件传递给函数

我一直在尝试创建一个在 Shiny 应用程序中使用的通用函数,该函数将允许使用侧边栏菜单按任意条件列表过滤数据框。因此,您可以使用侧边栏菜单来选择要过滤的列和要过滤的条件。

这是我使用 mtcars 数据集创建的当前适用于我的目的的 Rmd 的精简可重现示例:

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

请参阅我的函数filter1_by,filter2_by等,dplyr::filter_at因为我必须将列名与非标准评估中的值区别对待。这迫使我必须根据我想要的过滤器数量来创建几个函数。例如:

我真正想做的只是创建一个函数filter_by(df, ...),它将接受任意一组过滤条件,例如:

希望有任何关于如何编码的建议filter_by

谢谢!

0 投票
2 回答
559 浏览

r - dplyr() 中的非标准评估和 quasiquotation 未按(天真)预期工作

我正在尝试搜索数据库,然后"derived_name"在下面的可重现示例中使用源自原始搜索的名称标记输出。我正在使用dplyr管道%>%,并且在进行准报价和/或非标准评估时遇到了麻烦。具体来说,在最终函数中使用count_colname派生自 的字符对象无法对数据帧进行子集化。"derived_name"top_n()

基于这个讨论,我认为上面的代码可以工作。而这篇文章引导我尝试top_n_(),这似乎不存在。

我正在学习vignette("programming")这有点过头了。这篇文章让我尝试了!! sym()有效的语法,但我不知道为什么!帮助理解为什么下面的代码工作将不胜感激。谢谢。

基于@lionel 和@Tung 下面的问题和评论的其他令人困惑的示例。这里让我感到困惑的是,帮助文件说sym()“将字符串作为输入并将它们转换为符号”和!!“取消引用它的参数”。但是,在下面的示例中,sym(count_colname)似乎取消引用derived_name_letr_count. 我不明白为什么!!需要 in !! sym(count_colname),因为sym(count_colname)qq_show(!! sym(count_colname))给出相同的值。

0 投票
1 回答
134 浏览

r - group_by 和选择助手/标准评估

我正在重写项目中的一些代码,我需要按(并总结)字符变量中的变量名进行分组,类似于:

这将适用于group_by_已弃用的标准评估版本,group_by如下所示:

是否可以使用group_by并引用和取消引用来存档它,或者我可以使用像in这样的x选择助手?matchesgroup_by

我无法更改x存储方式,因为项目的其他部分仍然使用 split-lapply 之类的split(test, test[, x])......

0 投票
2 回答
152 浏览

r - 函数中的动态选择表达式

我正在尝试编写一个将转换此数据框的函数

在这个数据框中

但我希望该函数能够处理任意数量的列。因此,如果我有 S1、S2、S3、S4 或者如果有额外的类别,即 DS1、DS2,它也会起作用。理想情况下,该函数将确定哪些列堆叠在一起的模式、每列的集合数、输出列的名称以及还应保留的任何变量的名称作为参数。

这是我对这个功能的尝试:

我可以让sel_fun零件适用于这样的固定数量的模式

但是我尝试过的动态版本不起作用并给出了这个错误:

0 投票
2 回答
1758 浏览

r - 使用 dplyr 改变具有条件的多个列

我有一个大型数据集,我想为其创建 50 个新变量,其中的值取决于先前列中的值,并且变量的名称反映了这一事实。为了更容易理解,这里举个例子:

现在有了这个数据集,我想创建虚拟变量,如果具体观察是在事件发生前一年、前 2 年等,以及向前,则编码。一种笨拙的方法(有效)是:

其中 b1 代表“一年前”,f2 代表“两年前”。结果如下所示:

由于我有 50 多个列要创建,我想知道如何自动创建,这样我就不必复制粘贴 49 次并手动更改条件和变量名。我花了一些时间在这个线程这个线程和 CV上查看 SO ,但我仍然一无所知。我尝试了以下不起作用的代码:

理想情况下,我想学习如何使用 dplyr 进行操作,但如果有明显的 Base R 解决方案,我也很乐意学习它。

谢谢!

0 投票
0 回答
57 浏览

r - 向量化 if/else 构造以避免在条件为 FALSE 时调用昂贵的函数?

背景

我有一个计算昂贵(和SLOW)的函数,它是从另一个函数中调用的,该函数是 dplyr 管道的一部分:

根据变量Type(字符串)是匹配“男性”还是“女性”,该函数会做两件事之一。如果有匹配,native_last_name_alpha将运行计算成本高且速度慢的函数,该函数会执行一些其他操作。如果没有匹配,native_last_name_alpha将返回NA。目前,因为这是矢量化的,所以我正在使用if_elsecase_when确定应该发生什么,例如:

问题是无论条件评估为TRUEor 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

条件为真时的返回值和条件为假时的返回值都被评估,并且条件用于将结果向量拼接在一起。

因此,我昂贵且缓慢的功能运行的次数比实际需要的要多得多。

我怎样才能避免这种情况?

我想要什么

我正在寻找替代的矢量化实现,if_else并且case_when仅在条件为真时评估结果为真。

到目前为止我尝试过的

我尝试编写自己的if_else/向量化实现ifelse,但没有成功。我也尝试过非标准评估,但我知道的不够多,无法完成这项工作。我猜如果我可以if_else返回一个未计算的表达式,然后我稍后会在适当的时间进行计算(有点像冻干函数调用),这可能是解决方案的一部分。但到目前为止还没有快乐。

有什么我错过了轻松做我想做的事吗?或者有人可以提供一些关于实施的提示吗?谢谢!