问题标签 [rlang]

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

r - 整洁的评估编程和ggplot2

试图编写一个相对简单的包装器来生成一些图,但无法弄清楚如何指定分组变量的整洁评估,该分组变量指定为...一个示例函数,该函数对变量进行分面但不通过分组进行区分......

很好用,但是如何区分不同的hair_color?通常这是在内部完成的,aes()但由于这是使用quos()(即quo_group)我应该(我认为)aes_()使用的结果

我现在看不到或解决了多次阅读dplyr 编程的错误。

谁能指出我的错误/给我指路?

0 投票
3 回答
1671 浏览

r - 如何将表示表达式的字符串传递给 dplyr 0.7 动词?

我想了解如何将表示表达式的字符串传递给 dplyr,以便字符串中提到的变量被评估为数据框中列上的表达式。关于这个主题的主要小插曲涵盖了 quosures 的传递,并且根本不讨论字符串。

很明显,在表示表达式时,quosures 比字符串更安全、更清晰,所以当可以使用 quosures 代替时,我们当然应该避免使用字符串。但是,当使用 R 生态系统之外的工具时,例如 javascript 或 YAML 配置文件,通常必须使用字符串而不是 quosures。

例如,假设我想要一个使用用户/调用者传入的表达式进行分组计数的函数。正如预期的那样,以下代码不起作用,因为 dplyr 使用非标准评估来解释group_by.

在 dplyr 0.5 中,我们将使用标准评估,例如group_by_(.dots = groups),来处理这种情况。既然不推荐使用下划线动词,我们应该如何在 dplyr 0.7 中做这种事情?

在只是列名的表达式的特殊情况下,我们可以使用这个问题的解决方案,但它们不适用于更复杂的表达式2 * cyl,例如不仅仅是列名。

0 投票
1 回答
1800 浏览

r - 如何使用 quosures 将命名向量传递给 dplyr::select?

使用旧select_()函数,我可以将命名向量传递给 select 并立即更改位置和列名:

我尝试使用 quosures 和拼接做类似的事情——选择列效果很好,但向量的名称(因此同时重命名列)似乎被忽略了。以下两个都返回数据帧,其列名为barand foo,但不是newbarand newfoo

有没有办法使用新的 NSE 方法使用命名向量来重命名和重新排序列?

0 投票
2 回答
573 浏览

r - 包中的 dplyr 0.7.0 tidyeval

前言

我通常dplyr在我的包裹中使用。在此之前0.7.0,我使用下划线版本的dplyr动词来避免在R CMD CHECK. 例如,代码:

会产生R CMD CHECK注释:

相比之下,使用标准评估版:

没有产生这样的注释。

但是,在dplyrdplyr 0.7.0的小插图编程中说,在包中包含函数(以避免注释)的适当语法是:dplyr

因此,新闻文件说“不再需要每个主要动词的下划线版本,因此这些功能已被弃用(但为了向后兼容而保留)。”

问题

小插图说上面的新语法不会产生R CMD checkNOTES,“前提是你也用 . 导入rlang::.data@importFrom rlang .data。” 但是,当我运行代码时:

此错误是否类似于以下错误?

也就是说,对于某些函数,以包为前缀调用它们会产生错误?(可能与它们是否已被导出有关?)

评论

dplyr顺便说一句,在 0.7.0 中是否有一种更简洁的方式来使用新语法编写对包友好的函数?特别是 的语法dplyr >=0.7.0

比以下的语法更冗长dplyr <0.7.0

随着更多变量被引用,详细程度也会增加。但是,我不想在带下划线的版本中使用不那么冗长的语法,因为它已被弃用。

0 投票
1 回答
702 浏览

r - 在 dplyr 0.7.0+ 中正确使用 dplyr::select,使用字符向量选择列

假设我们有一个字符向量cols_to_select,其中包含我们要从数据框中选择的一些列df,例如

假设我们也想使用dplyr::select它,因为它是使用的操作的一部分,%>%因此使用select使代码易于阅读。

似乎有许多方法可以实现这一点,但有些方法比其他方法更强大。请你能告诉我哪个是“正确”的版本,为什么?或者也许还有另一种更好的方法?

ps我意识到这可以在base R中简单地使用df[,cols_to_select]

0 投票
1 回答
98 浏览

r - 查找调用的 ...(点)参数的原始环境

我希望能够找到...调用的(点)参数源自的环境。

设想

例如,考虑一个函数

我们想要一个env_dots()从内部调用的函数,它可以在对的调用foo()中找到 的原始环境,即使对 的调用是深度嵌套的。也就是说,如果我们定义...foo()foo()

并嵌套一个对 的调用foo,就像这样,

那么调用baz()应该返回...in (嵌套)调用foo(...)发起的环境:这是进行调用的环境bar(1, 2),因为2(而不是1)被传递给foo. 特别是,我们应该得到

天真的实现env_dots()

Updateenv_dots()在这里定义的一般不会起作用,因为 final...可能由在调用堆栈的多个级别调用的参数填充。

这是一种可能性env_dots()

这似乎有效:与

我们得到

问题

上面的实现env_dots()效率不是很高。

  1. env_dots()rlang和/或base R中是否有更巧妙的实现方式?

  2. 如何将match.call()调用移至 inside env_dots() match.call(sys.function(-1), call = sys.call(-1), expand.dots = FALSE)确实会起作用。

备注— 无法从 中推断点的起源环境rlang::quos(...),因为某些 quosures 不会被赋予调用环境(例如,当表达式是文字对象时)。

0 投票
1 回答
161 浏览

r - 用于构建变量名称的 Dplyr Tidyyeval

我正在尝试构建一个函数,允许我对以特定前缀开头的列执行函数。我正在努力弄清楚如何让名称评估为正确的东西。

我查看了dplyr它谈论编程的网站,但无法弄清楚如何使其正确评估。

我正在使用dplyr@hadley 介绍的 on CRAN (v0.70)的最新版本tidyeval

代表

0 投票
0 回答
174 浏览

r - 我是否正确/合理地使用 NSE 和 rlang?

我一直在阅读使用 dplyr 进行编程,并尝试将它描述的想法应用到我的工作中。我有一些有用的东西,但我不清楚我是否以“正确”的方式完成了它。我可以做一些更优雅或更简洁的事情吗?

我有一个tibblewhere 行是场景,列与在该场景中运行的测试相关。有两种类型的列,一种是存储在该场景中计算的测试统计量,另一种是存储该测试的自由度。

所以,这是我拥有的数据类型的一个小玩具示例:

我想计算将基于 itsstat和 its的每个测试的摘要df。我的示例是我想计算stat每个组的中位数,其中组由df. 不能保证分组在测试中是相同的,甚至不能保证组的数量是相同的。

所以,这就是我所做的:

这行得通。但是,有经验的rlang用户会这样做吗?我是 NSE 的新手,对rlang重复使用两个嵌套函数(UQ(sym(.)))有点惊讶。

我很高兴使用UQ而不是!!,只是因为我更喜欢传统的函数符号。

根据评论,我摆脱了namespace::function符号,现在我的函数看起来并不那么冗长:

0 投票
2 回答
1254 浏览

r - 以编程方式将 dplyr::case_when 与参数一起使用

我希望能够以编程方式使用dplyr'scase_when来替换基本 Rcut()函数。

目前,case_when 可以通过 NSE 与外部参数一起使用,例如:

我想要做的是:将它与另一个变量一起使用,在 mutate

这个想法是这样的,虽然我不知道如何让它工作:

我希望能够定义要过滤的列(在字符串内),并检索类似的内容(此示例不起作用,因为它是所需的语法):

谢谢你的帮助 :)

0 投票
0 回答
24 浏览

r - `get()` 和 `UQ()` 之间的区别

我正在尝试将 dplyrgroup_by()用于名为 ( choice) 的变量,该变量会根据给 Shiny 应用程序的输入而变化,为此我一直在尝试使用rlang::UQ(choice). 尽管它适用于get(choice). 这是一个小例子:

和变量:

现在我正在尝试两种方法:

和:

(我实际上并不是在追求这个确切的结果,我只是想展示一下不同之处。)

知道我做错了什么吗?