问题标签 [tidyeval]

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 回答
90 浏览

r - 将(函数)用户指定的列名传递给 dplyr do()

原始问题

谁能向我解释为什么 unquote 在下面不起作用?

我想do在 0.7.4 版本的调用中传递(函数)用户指定的列名dplyr。与使用do_. 一个基本的(成功的)示例忽略了在此处使用非常不必要的事实,do例如:

rlang::从现在导出的 dplyr 0.7.5 开始,这是不必要的ensym。我已经包括了 Lionel 关于使用ensymhere 而不是的建议enquo,因为前者保证 的值x是一个符号(而不是表达式)。

取消引用在这里没有用(例如其他dplyr 示例),替换quo_name(x)!! x上面的会产生以下错误:

解释

根据接受的响应,根本原因是do不会在其他 dplyr 函数(例如mutate)使用的相同环境中评估表达式。

我从文档或源代码中都没有发现这一点非常清楚(例如,比较 data.frames 的源代码,mutate如果do愿意的话,可以跟着 Alice 走下兔子洞),但本质上——这可能不是什么新鲜事最多;

  • do在其父环境是调用环境的环境中计算表达式,并将 data.frame 的当前组(切片)附加到符号.,并且;
  • 其他 dplyr 函数“或多或少”评估 data.frame 环境中的表达式,其中 parent 是调用环境。

另请参阅Advanced R. 22. 评估以获取“数据屏蔽”方面的描述。

0 投票
1 回答
1794 浏览

r - 如何在 lapply 期间将 ggplot x-label 设置为等于变量名?

我正在针对多个 x 变量绘制一个 y 变量的图。我有一个使用 lapply 的工作解决方案。但是,我无法将 x 变量的名称写为每个图的 x 标签。这是我所拥有的简化示例:

目标是针对每个 x 变量绘制 y 变量,生成三个图,并将每个 x 变量的名称添加为 x 轴标签。

生成一个包含一个 y 变量和三个 x 变量的数据框:

一个应该将变量名称作为字符串检索的函数:

生成 y 对 x 变量的绘图的函数:

调用 lapply 以在 df 的每一列上执行 generate_plot:

这会产生三个图,每个图都有“variable.x”作为其 x 标签,而不是所需的变量名称 x1、x2 和 x3。

0 投票
1 回答
174 浏览

r - 将 NSE enquo 与 dply 和 tidyr 一起使用(完整的问题(嵌套(...),...)

我正在尝试将 NSE 与dplyrand一起使用tidyr

我有一个产品列表,每个地区每个月的数量。产品和区域具有层次结构(ProductLevel1 粗于 ProductLevel2 粗于 Product Level3 ...)。在制作图表之前,我想使用tidyr::nesting和添加没有音量的月份tidyr::complete

这在功能层面上tidyr::nesting似乎失败了。

我收到的错误是:

如果我删除!!嵌套函数中的 s ,那么错误是

过去有一个类似的问题没有答案:dplyr programming: unquote-splicing cause overscope error with complete() and nesting()

数据集样本:

和会话信息:

0 投票
1 回答
844 浏览

r - 基于 unquote-splicing (!!!) 排除多列

试图排除

  • 调用中的多个tidyr::gather()
  • 通过字符向量参数(的输出shiny::selectInput)而不是通过...
  • 程序化的方式

我将如何使用整洁的 eval 功能来做到这一点?

由于我通过单个函数参数传递多个列名,因此我认为我需要使用!!!(unquote-splicing) 而不是Programming with dplyr!!中所述。但这似乎并不能很好地发挥作用,而且似乎是造成了麻烦。tidyselect::vars_select()-

这是我想做的基本事情:

我想通过单个参数传递列名(就像在闪亮的应用程序中一样,它也将通过它提供服务input$<select_input_id>):

然后我试着看看-是不是问题:

这似乎行得通。

然后我尝试-输入实际的符号名称,但这不起作用(至少是我尝试的方式;-)):

编辑

在莱昂内尔的帮助下,我能够拼凑起来:

甚至简化:

reprex 包(v0.2.0) 于 2018 年 4 月 26 日创建。

0 投票
1 回答
552 浏览

r - 为主体中 dplyr 参数的函数提供多组变量

这是数据:

和向量,我想使用:

2nd & 5th 和 3rd & 4th 向量相同,但请假设它们不同并将它们保留为不同的向量。

现在我想创建一个通用函数,我可以在其中获取数据和这些向量来获得结果。

问题是向函数提供多个变量的多个向量以用作主体中的 dplyr 参数。我尝试查看http://dplyr.tidyverse.org/articles/programming.html,但无法解决上述问题。

0 投票
2 回答
183 浏览

r - 使用整洁的评估过滤数据框

我正在处理一个大型数据集。首先,对于某些列(X1,X2,...),我试图确定一个值范围(a,b)由重复值(a > n,b > n)组成。接下来,我希望根据将相应列与上一步中给出的结果相匹配的条件过滤行。

这是一个模拟我面临的场景的可重现示例,

我可以通过以下方法识别范围,

但是,要过滤掉超出上限的值,这就是我所做的。

我相信必须有一种更有效、更优雅的方式来基于整洁的评估过滤结果。有人可以指出我正确的方向吗?

提前谢谢了。

0 投票
2 回答
67 浏览

r - 整洁的评估范围是否有限制?

我正在尝试使用 tidy 评估,如dplyr 0.7.0.

但是,在内部的函数调用期间,mutate()我遇到了错误。似乎没有像我预期的那样评估变量。

相反,我必须使用这种不整洁的 eval 语法来获得所需的输出。

有没有办法在这个例子中使用整洁的评估?

0 投票
1 回答
167 浏览

r - R:以字符串形式给出的表达式的条件评估,作为 dplyr mutate 的值

我正在尝试使用 case_when 执行 dplyr::mutate() 以在从字符串片段组装的各种公式之间进行选择。但是,在引用并随后取消引用它们之前,我显然没有将字符串正确转换为表达式。我尝试了七八种方法,都没有成功。

从字符串组装表达式的原因是我有大量变量组,它们的名称仅通过后缀不同,例如,用于区分名义或通货膨胀调整后的美元变量。我使用 case_when 是因为类似的变量在不同年份有不同的名称,有时还有不同的聚合结构。

这是一个非常简化的示例:

数据:

的值bus在 1962 年应该是 58,在 1968 年应该是 70.5。

我发现许多地方建议使用 parse(text="my_string") 作为将字符串转换为表达式的一种方式,例如 Martin Maechler 的早期示例 (2002 年)。但我也发现了很多地方说永远不要这样做,比如财富 106 强和 Martin Maechler 最近的例子。我认为强大的 Maechler 博士对他宝贵提供的解决方案的强烈否定作为强有力的证据表明这不是一个好主意,但我不理解他提出的替代方案,因为它们似乎评估为字符串。

0 投票
2 回答
76 浏览

r - 使用数据框名称作为模型表中的列

我很困惑为什么以下不起作用。我正在尝试将数据框/tibble 的名称用作多模型数据框中的列,但不断遇到以下错误。这是一个例子:

请注意,以下所有工作:

但是当我尝试以下操作时:

我得到错误

有人可以弄清楚如何进行这项工作吗?

0 投票
2 回答
262 浏览

r - purrr::pmap 与 rlang 的混淆行为;“引用”或不引用 Q 的论点

我有一个自定义函数,我正在使用rlang. 无论输入的参数是带引号还是不带引号,此函数都可以正常工作。但是,奇怪的是,当这个函数与 一起使用时purrr::pmap,它只有在参数被引用时才有效。

所以我有两个问题:

  1. 为什么函数会这样?

  2. 如何使用rlang这样的函数创建一个函数,即使使用 in 也不必引用参数purrr::pmap

这是一个使用简单函数来突出这个问题的最小表示:

reprex 包(v0.2.0) 于 2018 年 5 月 21 日创建。