问题标签 [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.
r - 整洁的评估编程和ggplot2
试图编写一个相对简单的包装器来生成一些图,但无法弄清楚如何指定分组变量的整洁评估,该分组变量指定为...
一个示例函数,该函数对变量进行分面但不通过分组进行区分......
很好用,但是如何区分不同的hair_color
?通常这是在内部完成的,aes()
但由于这是使用quos()
(即quo_group
)我应该(我认为)aes_()
使用的结果
我现在看不到或解决了多次阅读dplyr 编程的错误。
谁能指出我的错误/给我指路?
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
,例如不仅仅是列名。
r - 如何使用 quosures 将命名向量传递给 dplyr::select?
使用旧select_()
函数,我可以将命名向量传递给 select 并立即更改位置和列名:
我尝试使用 quosures 和拼接做类似的事情——选择列效果很好,但向量的名称(因此同时重命名列)似乎被忽略了。以下两个都返回数据帧,其列名为bar
and foo
,但不是newbar
and newfoo
:
有没有办法使用新的 NSE 方法使用命名向量来重命名和重新排序列?
r - 包中的 dplyr 0.7.0 tidyeval
前言
我通常dplyr
在我的包裹中使用。在此之前0.7.0
,我使用下划线版本的dplyr
动词来避免在R CMD CHECK
. 例如,代码:
会产生R CMD CHECK
注释:
相比之下,使用标准评估版:
没有产生这样的注释。
但是,在dplyrdplyr 0.7.0
的小插图编程中说,在包中包含函数(以避免注释)的适当语法是:dplyr
因此,新闻文件说“不再需要每个主要动词的下划线版本,因此这些功能已被弃用(但为了向后兼容而保留)。”
问题
小插图说上面的新语法不会产生R CMD check
NOTES,“前提是你也用 . 导入rlang::.data
了@importFrom rlang .data
。” 但是,当我运行代码时:
此错误是否类似于以下错误?
也就是说,对于某些函数,以包为前缀调用它们会产生错误?(可能与它们是否已被导出有关?)
评论
dplyr
顺便说一句,在 0.7.0 中是否有一种更简洁的方式来使用新语法编写对包友好的函数?特别是 的语法dplyr >=0.7.0
:
比以下的语法更冗长dplyr <0.7.0
:
随着更多变量被引用,详细程度也会增加。但是,我不想在带下划线的版本中使用不那么冗长的语法,因为它已被弃用。
r - 在 dplyr 0.7.0+ 中正确使用 dplyr::select,使用字符向量选择列
假设我们有一个字符向量cols_to_select
,其中包含我们要从数据框中选择的一些列df
,例如
假设我们也想使用dplyr::select
它,因为它是使用的操作的一部分,%>%
因此使用select
使代码易于阅读。
似乎有许多方法可以实现这一点,但有些方法比其他方法更强大。请你能告诉我哪个是“正确”的版本,为什么?或者也许还有另一种更好的方法?
ps我意识到这可以在base R中简单地使用df[,cols_to_select]
r - 查找调用的 ...(点)参数的原始环境
我希望能够找到...
调用的(点)参数源自的环境。
设想
例如,考虑一个函数
我们想要一个env_dots()
从内部调用的函数,它可以在对的调用foo()
中找到 的原始环境,即使对 的调用是深度嵌套的。也就是说,如果我们定义...
foo()
foo()
并嵌套一个对 的调用foo
,就像这样,
那么调用baz()
应该返回...
in (嵌套)调用foo(...)
发起的环境:这是进行调用的环境bar(1, 2)
,因为2
(而不是1
)被传递给foo
. 特别是,我们应该得到
天真的实现env_dots()
Update —env_dots()
在这里定义的一般不会起作用,因为 final...
可能由在调用堆栈的多个级别调用的参数填充。
这是一种可能性env_dots()
:
这似乎有效:与
我们得到
问题
上面的实现env_dots()
效率不是很高。
env_dots()
在rlang和/或base R中是否有更巧妙的实现方式?如何将match.call()
调用移至 insideenv_dots()
?match.call(sys.function(-1), call = sys.call(-1), expand.dots = FALSE)
确实会起作用。
备注— 无法从 中推断点的起源环境rlang::quos(...)
,因为某些 quosures 不会被赋予调用环境(例如,当表达式是文字对象时)。
r - 用于构建变量名称的 Dplyr Tidyyeval
我正在尝试构建一个函数,允许我对以特定前缀开头的列执行函数。我正在努力弄清楚如何让名称评估为正确的东西。
我查看了dplyr
它谈论编程的网站,但无法弄清楚如何使其正确评估。
我正在使用dplyr
@hadley 介绍的 on CRAN (v0.70)的最新版本tidyeval
代表
r - 我是否正确/合理地使用 NSE 和 rlang?
我一直在阅读使用 dplyr 进行编程,并尝试将它描述的想法应用到我的工作中。我有一些有用的东西,但我不清楚我是否以“正确”的方式完成了它。我可以做一些更优雅或更简洁的事情吗?
我有一个tibble
where 行是场景,列与在该场景中运行的测试相关。有两种类型的列,一种是存储在该场景中计算的测试统计量,另一种是存储该测试的自由度。
所以,这是我拥有的数据类型的一个小玩具示例:
我想计算将基于 itsstat
和 its的每个测试的摘要df
。我的示例是我想计算stat
每个组的中位数,其中组由df
. 不能保证分组在测试中是相同的,甚至不能保证组的数量是相同的。
所以,这就是我所做的:
这行得通。但是,有经验的rlang
用户会这样做吗?我是 NSE 的新手,对rlang
重复使用两个嵌套函数(UQ(sym(.))
)有点惊讶。
我很高兴使用UQ
而不是!!
,只是因为我更喜欢传统的函数符号。
根据评论,我摆脱了namespace::function
符号,现在我的函数看起来并不那么冗长:
r - 以编程方式将 dplyr::case_when 与参数一起使用
我希望能够以编程方式使用dplyr
'scase_when
来替换基本 Rcut()
函数。
目前,case_when 可以通过 NSE 与外部参数一起使用,例如:
我想要做的是:将它与另一个变量一起使用,在 mutate
这个想法是这样的,虽然我不知道如何让它工作:
我希望能够定义要过滤的列(在字符串内),并检索类似的内容(此示例不起作用,因为它是所需的语法):
谢谢你的帮助 :)
r - `get()` 和 `UQ()` 之间的区别
我正在尝试将 dplyrgroup_by()
用于名为 ( choice
) 的变量,该变量会根据给 Shiny 应用程序的输入而变化,为此我一直在尝试使用rlang::UQ(choice)
. 尽管它适用于get(choice)
. 这是一个小例子:
和变量:
现在我正在尝试两种方法:
和:
(我实际上并不是在追求这个确切的结果,我只是想展示一下不同之处。)
知道我做错了什么吗?