问题标签 [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 - 使用非标准评估检查字符串是否是有效的数学表达式
我想检查以下字符串是否是有效的数学表达式:
通过“有效”,我的意思是表达式是
- 运算符(必须与变量或常量一起使用)
- 变量
x
和/或m
- 常数。
根据这个定义s1
,ands2
是有效的,而s3
不是s4
。
为了识别字符串是否有效,我编写了一个函数checkFxn
,首先尝试将字符串转换为调用或其一部分。如果成功,它将通过调用树递归并检查上述条件。如果满足条件,则按原样返回调用。如果不是,则抛出错误。
它似乎按预期工作,但我对我的使用持谨慎态度,eval
并想知道是否有人可以建议使用它的替代方法?我知道它遵循通常的词法范围规则,所以我担心它会在 gobal 环境中评估变量——有没有办法限制它的范围?我已经阅读了关于非标准评估的章节,但我无法弄清楚。
另外,有没有办法确定基函数或原语是否是数学运算符?我想使用比is.function
and更具体的东西is.primitive
。
r - 使用非标准评估按多列排序
假设我想订购一个data.frame
使用多列并使用非标准演变的产品。我可能有一个看起来像这样的函数
使用此函数时出现错误,因为我的列未在with
.
注意:我不希望使用dplyr::arrange()
这个问题,因为它增加了一个依赖。
r - dplyr 中的 filter() 如何评估自定义函数中 () 中的内容?
我正在尝试编写一个函数,该函数采用两个列名以及每个列名的上限和/或下限,这样我就可以使用我选择的列名和边界对数据进行子集化。
以 mtcars 为例,如果我想通过说我只想要具有cyl > 4
和的行来对数据进行子集化mpg > 15
,在这种情况下,我的函数将接受两个列名cyl
和mpg
,每个列名还有两个下边界,即 4 和 15。当然,在函数中,我可以选择为其分配一个上限,以将列名(变量)保持在一定范围内。
所以我想出了类似下面的东西,一个函数,它接受您选择的两个变量名称以及每个变量的上限和/或下限。
如果我只给这个变量一个上限或下限,那么它会给我任何小于或大于这个边界的东西,如果我给函数同时给出上限和下限,它会给我返回落入该范围的行。
当我以 mtcars 为例调用此函数时
我在 final1 中得到了 avgcrl 的 0 个计数和 NaN。所以当filter()
评估里面的内容时()
,它只会得到 FALSE,没有 TRUE,我认为这就是为什么没有返回行。
我有一个关于为什么会发生这种情况的理论。如果我这样做:
它返回:
这显然不是我所期望的。如果我这样做:
它返回
这就是我想要的filter()
函数内部的函数。所以我猜当filter()
评估里面的内容时()
,它会自动将括号放在整个表达式周围,就像
做了,它只返回一个 FALSE。因此,如果这真的是我所期望的原因,我该如何让我filter()
知道我真正想要的是让它像这样评估:
不是这个:
如果我猜的不是怎么回事,也请帮助我。
r - mutate_ 已弃用、简单易懂的替代方案?
我正在尝试创建一个创建变量的函数。像这样:
df
是我正在使用的数据框,rain
是 中的数字变量df
,并且extreme_rain
是我要创建的变量的名称。
如果我使用mutate_()
一切都很好,但问题是它已被弃用。但是,我在 stackoverflow ( 1 , 2 , 3 ) 中找到的解决方案和小插图似乎不适合我的问题,或者它似乎比我需要的复杂得多,因为我找不到关于如何工作的好例子with quo()
, !!
without space, !!
with space, 如何替换=
for :=
,我不知道与它们一起工作是否会解决我遇到的问题,或者它甚至是必要的,因为执行此功能的最终目标是使代码更清晰。有什么建议么?
r - 在 glue::glue 调用中使用函数的未命名参数 ...
我想要一个函数将两个字符变量粘合在一起,即使在调用函数之前不知道一个(或多个)的名称。
我想要的答案与此函数的结果相同,并在我假设第二个字段的名称已知的地方调用。
r - ggplot2:将变量移交给函数(非标准评估)
我正在尝试编写一个函数,其中一个分组变量被移交给一个 ggplot2 表达式。
这有效
这不起作用
这也不起作用(受 dplyr 启发)
r - 有没有办法输入 dplyr::summarise 变量?
这是一个我似乎无法解决的非标准评估问题。我想做一个输入列名并输出摘要的函数。对于此功能,重要的是summarise(name,...)
可以将 分配为输入,如下所示:
这有效:
但这不是,这就是我需要的。
任何帮助是极大的赞赏。
r - 带有 ggplot2 的程序化饼图
我正在使用以下代码创建两个并排的饼图
这很好用,但不幸的是我需要以编程方式执行此操作。特别是,作为函数的一部分,我需要能够将“fill = cyl”和“facets = .~ gear”更改为其他变量。理想情况下,我可以将变量名称作为字符串传递给上面的代码。
我尝试使用aes_string()
and quote
/ substitute
,但每次都会得到意想不到的结果。请指教。
r - 'Can't use `!!!` at top level.' 是什么意思?是什么意思以及如何解决?
我正在尝试创建一个用于创建棒棒糖图的函数ggplot2
。我想将所有参数传递...
给aes()
within geom_point()
。但是,我想排除size
参数传递到aes()
内部geom_segment()
(如果您查看a()
下面的输出,原因很明显)。因此,我捕获...
usingrlang::enquos()
而不是按原样传递它。a()
在我将 to 传递dots
给this 的函数aes()
中ggplot()
没有问题。但是在功能中b()
我得到了错误Can't use '!!!' at top level.
我被困在这一点上,希望能提供任何解决此问题的意见。
这是我的sessionInfo()
:
r - R - 作为函数列表的函数参数 - 检查参数而不评估?
编辑:最初的共鸣表明我的文章将人们的注意力集中在最佳实践问题而不是技术问题上。但是,我想关注一个技术问题,下面只是一个玩具示例:
如果有人将列表传递给函数参数,您如何捕获和检查该列表中的各个元素,而不会冒系统尝试调用/评估这些元素的风险?
例如,如果用户向参数传递一个可能合适或不合适的函数列表,或者加载了相关的包,该函数如何安全地检查请求的函数?
假设我想构建一个迭代可能应用的其他函数的函数。实际示例会调用不同的建模函数,但这里有一个更容易看到的玩具示例:
假设 newfunc() 可以使用的函数包括函数 nchar() 和 length()。如果我们提供这些,我们会得到以下信息:
但是,假设 newfunc() 也能够采用 str_to_upper() 之类的东西,它来自包stringr。传递 str_to_upper() 可以正常工作,但前提是预先加载了stringr :
我想将代码放在可以调查列表元素并确定是否需要加载任何包(如stringr )的函数中。另外,我想检查列出的函数是否来自可接受的集合(如果有人通过mean()
,或者更糟糕的是,rcorr()
来自未加载的Hmisc ,它会捕获)。
我知道如何func.list.test <- deparse(substitute(func.list)
获取参数的文字文本,但我不知道如何在单个元素上执行此操作而不会在某些函数不存在时触发错误。
(而且我不想对 的整体解析输出采取字符串操作的hacky路线func.list.test
)
理想情况下,对于这个用例,我想知道这是否可以使用基本 R 技术来完成。但是,如果这是最好的/唯一的方法,请随时解释如何使用更新的方法(如整洁的评估/quosures)来做到这一点(尽管知道我目前对这些方法的熟悉程度非常有限)。
任何帮助,将不胜感激。