问题标签 [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 回答
1656 浏览

r - R dplyr 对仅通过其字符串名称知道的列进行操作

我正在努力使用dplyrR 中的编程来操作数据框的列,这些列仅由它们的字符串名称知道。我知道最近有一个更新来dplyr支持 quosures 等,我在这里回顾了我认为新的“使用 dplyr 编程”文章的相关组件:http: //dplyr.tidyverse.org/articles/programming .html。但是,我仍然无法做我想做的事。

我的情况是我仅通过字符串名称知道数据框的列名。因此,我不能在调用函数或什至脚本中使用非标准评估,dplyr其中列名可能会在运行之间发生变化,因为我通常无法硬编码未引用的(即“裸”)列名. 我想知道如何解决这个问题,我猜我用新的引用/取消引用语法忽略了一些东西。

例如,假设我有定义数据分布的截止百分位数的用户输入。用户可以使用他/她想要的任何百分位数运行代码,他/她选择的百分位数将改变输出。在分析中,使用所用百分位数的名称在中间数据框中创建一列;因此,此列的名称会根据用户输入的截止百分位数而变化。

下面是一个最小的例子来说明。我想用截止百分位数的各种值调用该函数。我希望命名的数据框MPGCutoffs有一个根据所选截止分位数命名的列(这目前在下面的代码中有效),并且我想稍后对该列名进行操作。由于这个列名的普遍性,我在pctCutoff写函数的时候只能从输入的角度知道,所以我需要一种方法在只知道定义的字符串的情况下对其进行操作probColName,它遵循基于预定义的模式关于 的值pctCutoff

dplyr::filter()声明是我无法正常运行的。我试过了:

dplyr::filter( mpg > probColName )- 没有错误,但没有返回行。

dplyr::filter( mpg > !!probColName )- 没有错误,但没有返回行。

我还看到了一些例子,我可以将类似的东西传递quo(P95)给函数,然后在对dplyr::filter();的调用中取消引用它。我已经让它工作了,但它并没有解决我的问题,因为它需要在函数之外对变量名进行硬编码。例如,如果我这样做并且用户传递的百分位数是 0.90,则调用dplyr::filter()失败,因为创建的列是 namedP90而不是P95

任何帮助将不胜感激。我希望有一个简单的解决方案,我只是忽略了。

0 投票
1 回答
33 浏览

r - 将函数绑定到环境以访问存储的变量,有什么缺点?

问题: 我需要一个只接受一个参数但需要访问其他一些变量的函数。我不想将这些存储在.GlobalEnv.

当前解决方案: 使用一个接受所有需要参数的函数,创建另一个适应环境的函数。

例子:

我坚信这种方法有缺点,但我无法确定这些缺点可能是什么。如果你能帮助我,我会很高兴。

0 投票
1 回答
99 浏览

r - 使用 tidyeval 工具(如 `!!` 和 `:=`)构建列表

我正在寻找一种list基于包中定义Rtidyevalrlang框架轻松构建的方法。

以下是我想要实现的目标:

我目前可以获得的是:

或者,添加quosure时它可能会变得更好一点:

不幸的是,我不知道如何从这里进一步前进。

换句话说,我想有一个类似的效果,就像我们可以在dplyr包中得到的一样:

0 投票
2 回答
388 浏览

r - 使用 tidyeval 进行程序化回归建模

我正在尝试使用 tidyeval 进行编程。

我想编写一个函数来为选定的结果变量运行逻辑回归模型:

但是得到:

!enquo_outcome 中的错误:无效的参数类型

(注意真实场景涉及更复杂的功能)。

这可能吗?

0 投票
1 回答
738 浏览

r - 在 SAS Enterprise Guide 上启用 RLANG

我想在我的 SAS EG 7.1 上使用 R 当我运行以下代码检查 R 是否启用时,我发现它不是

日志 :

SAS (r) 专有软件版本 9.4 TS1M3

NORLANG 禁止 SAS 执行 R 语言语句。

我想知道如何在我的 SAS 上启用 RLANG,以便我可以使用PROC IML等。

0 投票
1 回答
31 浏览

r - 在函数 F 中,使用 F 的参数作为 update() 的参数

我想要一个函数my_lm,如下所示:

但是我遇到了以下错误:

我怀疑我在滥用rlang,但我似乎无法弄清楚引用、取消引用和公式化的组合可以解决这个问题。

编辑:所需的输出就像我跑了:

数据=虹膜)

EDIT2:我还应该澄清一下,我真的对rlang用于解决此问题的解决方案感兴趣,update而不是使用paste,gsubformula.

0 投票
1 回答
303 浏览

r - 在 mutate_at 的 vars 参数中使用 quosures

我想编写一个简单的函数,该函数将利用调用中通过省略号传递的 quosures mutate_at

问题

代码产生:

期望的结果

结果应该等同于:


假设:

  • mutate_some函数必须采用 ellipsis 参数,该参数在mut_vars <- quos(...).

  • 特别是,我正在寻找一种类似于rlang::do_something_(mut_vars). 此功能是较长管道的一部分,我需要保留mut_varsquos()因为我稍后会使用它。

  • 我不想更改列名(如上面所需的结果)。

0 投票
1 回答
85 浏览

r - dplyr::filter 中的引用透明度:使列名可变

核心问题(它似乎归结为)

如何rlang::quo使用“左”而不是“右”侧引用透明的表达式构造调用

取自的帮助页面rlang::quo,这有效

虽然这不是:

问题放在更多的背景下

dplyr::mutate允许“表达式的两边”在两个表达式部分都可以引用透明的意义上是可变的(参见小插图):

我怎样才能在dplyr::filter能够使列名(“左侧”)引用透明/灵活的焦点中实现相同/相似的东西。

我想理想地结束这样的事情(伪代码):

我试过的

我知道这dplyr::filterdplyr::mutate他们期望的表达式类型不同。所以基于小插图我想出了这个版本,其中要评估的整个表达式作为参数传递:

但是,当我想使用参考时,这“迫使”我真正使用实际的列名c_id

我基本上不知道如何构造调用,dplyr::quo或者dplyr::enquo左侧部分包含列名的评估引用,而右侧部分包含要评估的逻辑查询的**未评估*引用:

换句话说,我认为 quosure 最终应该是~id == right,我不知道该怎么做

0 投票
1 回答
82 浏览

r - 如何在自定义函数中使用 rlang::UQS 中的变量?

我仍在尝试理解 R 中的 quosures,但我不明白为什么下面函数中的替换会失败。

似乎调用my.toggle(rlang::UQS(fn.args))应该等效于my.toggle(toggle = T)(实际上,这就是将函数调用包装在 中时得到的quo),但是该函数无法正确执行。我究竟做错了什么?

0 投票
1 回答
327 浏览

r - 通过 rlang quosures 和 dplyr 传递多个参数列表

目标:编写一个函数,它将一个数据帧作为其第一个参数,然后将两个附加参数(参数列表)传递给 dplyr::select该函数,以便该函数将返回两个数据帧。

这是一个工作示例

我更喜欢参数df1df2采取 a listnot a alist。但是,my_select如果参数为list

如果可能的话,我不想要求最终用户使用alist,因为我没有一个很好的方法来测试alist用于传递参数而不是list.

我尝试了几种rlang::UQ, rlang::UQE,rlang::UQSrlang::quo,rlang::enquos和的组合rlang::quos来解决这个问题。我认为最好的方法是:

有没有办法将rlang 包与dplyr一起使用,以便 的语法将返回与通过传递参数时my_select2相同的对象?my_selectalist