问题标签 [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.
r - R 评估函数参数的方式具有魔力
考虑以下 R 代码:
这行得通,但这里似乎有一些魔力。通常,当我们有一个类似的表达式时foo(bar)
,我们应该能够这样做:
但是,在提供的代码片段中,我们无法W == 1
在dplyr::filter()
! W
不是定义的变量。
这是怎么回事?
r - 将列表中的表达式捕获为文本
我目前有这个函数,它接受一个表和两个表达式列表,并对它们求值,将它们变成两个矩阵。我使用两个列表而不是...
因为我需要能够确定表达式是落在 Y 还是 Z 中。
例如:
但是,我还想将列表中的表达式捕获为文本,因此我可以使用它们来命名列。例如,我想要的输出是这样的:
我怎样才能做到这一点?
r - 创建可以判断变量输入是字符串还是符号的 dplyr 函数
我一直在研究“使用 dplyr 编程”小插图,因为我想创建使用 dplyr 函数的函数。我想使用我在闪亮的应用程序和交互式 R 工作中创建的功能。为了在闪亮中使用,我希望这些函数采用字符串参数并使用 sym 函数将它们转换为符号。为了在交互式会话中使用,我希望这些函数可以选择不必使用字符串。所以我制作的函数需要一种方法来判断某些参数是否是字符串。
我想出了一个办法。我只是好奇是否有更好和/或更优雅的方式来做到这一点。
我做了一个简单的函数“my_summarise”作为例子。它是与小插图不同的函数“my_summarise”版本。它使用 tryCatch 来检查 group_var 参数是否为字符串。
编辑: Onyambu 的答案是完美的。我只是对其进行了调整以使用一些 rlang 函数而不是它们的基本等效函数。
r - 在 apply 的函数中使用 dplyr::group_by
我想为我的数据集中的一组分组变量生成漂亮的摘要,对于每个组,我将显示前 6 个频率及其相关比例。我可以使用以下语法为单个分组变量获取此信息:
我如何修改这个表达式,以便它可以在应用函数中使用?
例如使用 mtcars,我尝试过这样的事情:
但它不起作用。知道我怎么能做到这一点吗?
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
。
谢谢!
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))
给出相同的值。
r - group_by 和选择助手/标准评估
我正在重写项目中的一些代码,我需要按(并总结)字符变量中的变量名进行分组,类似于:
这将适用于group_by_
已弃用的标准评估版本,group_by
如下所示:
是否可以使用group_by
并引用和取消引用来存档它,或者我可以使用像in这样的x
选择助手?matches
group_by
我无法更改x
存储方式,因为项目的其他部分仍然使用 split-lapply 之类的split(test, test[, x])
......
r - 函数中的动态选择表达式
我正在尝试编写一个将转换此数据框的函数
在这个数据框中
但我希望该函数能够处理任意数量的列。因此,如果我有 S1、S2、S3、S4 或者如果有额外的类别,即 DS1、DS2,它也会起作用。理想情况下,该函数将确定哪些列堆叠在一起的模式、每列的集合数、输出列的名称以及还应保留的任何变量的名称作为参数。
这是我对这个功能的尝试:
我可以让sel_fun
零件适用于这样的固定数量的模式
但是我尝试过的动态版本不起作用并给出了这个错误:
r - 使用 dplyr 改变具有条件的多个列
我有一个大型数据集,我想为其创建 50 个新变量,其中的值取决于先前列中的值,并且变量的名称反映了这一事实。为了更容易理解,这里举个例子:
现在有了这个数据集,我想创建虚拟变量,如果具体观察是在事件发生前一年、前 2 年等,以及向前,则编码。一种笨拙的方法(有效)是:
其中 b1 代表“一年前”,f2 代表“两年前”。结果如下所示:
由于我有 50 多个列要创建,我想知道如何自动创建,这样我就不必复制粘贴 49 次并手动更改条件和变量名。我花了一些时间在这个线程、这个线程和 CV上查看 SO ,但我仍然一无所知。我尝试了以下不起作用的代码:
理想情况下,我想学习如何使用 dplyr 进行操作,但如果有明显的 Base R 解决方案,我也很乐意学习它。
谢谢!
r - 向量化 if/else 构造以避免在条件为 FALSE 时调用昂贵的函数?
背景
我有一个计算昂贵(和SLOW)的函数,它是从另一个函数中调用的,该函数是 dplyr 管道的一部分:
根据变量Type
(字符串)是匹配“男性”还是“女性”,该函数会做两件事之一。如果有匹配,native_last_name_alpha
将运行计算成本高且速度慢的函数,该函数会执行一些其他操作。如果没有匹配,native_last_name_alpha
将返回NA
。目前,因为这是矢量化的,所以我正在使用if_else
并case_when
确定应该发生什么,例如:
问题是无论条件评估为TRUE
or FALSE
,昂贵的函数都会运行,这使得我的脚本运行起来非常缓慢。
深入挖掘 if_else、ifelse 和 case_when
我知道向量化的 if/else 语句if_else
和ifelse
(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
返回一个未计算的表达式,然后我稍后会在适当的时间进行计算(有点像冻干函数调用),这可能是解决方案的一部分。但到目前为止还没有快乐。
有什么我错过了轻松做我想做的事吗?或者有人可以提供一些关于实施的提示吗?谢谢!