问题标签 [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 - 使用替代来可靠地捕获包中的glue() 中的输入代码
我正在构建一些实用程序函数来简化cast(statement as type)
从 R 中更轻松地编写 SQL 查询的过程。
我这样做的方式是通过一个主力函数,as_type
该函数由几个一次性函数(例如as_bigint
)调用;至关重要的是,我还认为as_type
直接调用是一个有效的用例。
代码的基本结构如下:
具有预期的用途,例如
as_
(实际上,对于其他有效的 SQL 类型,还有几个有效的类型和函数;只有query_encode
被导出)
不幸的是,直接调用as_type
失败,因为如?substitute
(h/t Brodie G on Twitter)中所述:
如果 [a component of the parse tree] 不是 [the second argument to
substitute
]中的绑定符号env
,则它不变
我已经制定了以下解决方法,但它几乎感觉不到强大:
即,检查sys.calls()
并检查是否as_type
从其中一个as_
函数调用;将env
参数设置substitute
为parent.frame()
好像是,如果不是,则为当前环境。
这暂时有效:
问题是,这是解决这个问题的最佳方式吗?这样说来,这感觉像是一个基于意见的问题,但我的意思是——(1)这种方法是否像乍一看那样脆弱,(2)假设是这样,还有什么更强大的替代方案?
例如,值得注意的is.name(x)
是FALSE
from as_type
,但我不清楚如何使用它来继续。
r - 如何找到隐藏在函数内部的*所有*词法引用变量?
我正在尝试提取函数体内未在该函数中定义但在环境堆栈的某处定义的所有符号。我最初认为我可以使用 的返回值来做到这一点codetools::findGlobals
,但显然这个函数并没有完全按照我的想法做,因为它错过了引用表达式中引用的变量。请参阅下面的可重现示例:
鉴于 的这种限制findGlobals
,是否有首选的替代技术?
r - 什么是 R 中的逃生舱口?
我正在阅读Advanced R一书,对非标准评估一章中反复提到的“逃生舱”概念感到困惑。比如作者第一次提到这个词,它有如下定义:
作为开发人员,您应该始终提供一个逃生舱口:使用标准评估的函数的替代版本。
它也有一些关于逃生舱口的例子。其中一个示例来自Calling from another function部分。作者说:
通常,当函数被用户直接调用时,语言上的计算最有用,而当它们被其他函数调用时,用处不大。
请参见下面示例的代码:
但它不起作用:
作者说我们可以编写一个版本的子集2(),在这种情况下采用已经引用的表达式。代码如下所示:
然后它运行良好:
尽管作者给了我例子,但我仍然不明白逃生舱口。那么,有人可以在本书或 R 编程语言中解释它的定义吗?我的会话信息:
r - dplyr 非标准评估,函数外有卷曲
我看到的 curly curly 的所有示例都在编写函数的上下文中。
我只想循环我的分组变量并获取频率,所以我试图让这样的事情起作用:
但这并没有给出预期的输出,即如果我只是使用我会得到什么
如何在这个简单的设置中使用非标准评估?
请注意,我不是在询问group_by_at
类型解决方案,而是非标准评估解决方案,因此这不是dplyr group by colnames 的副本,描述为字符串向量
r - R非标准评估:将变量的名称作为参数传递给函数并让函数为其赋值
我确信这在某处得到了回答,但无法找到。用 dplyr 编程也没有给出答案。
我需要将变量的名称作为参数传递给函数,并让函数为其赋值。
用例:
我想为 odbc::dbConnect 编写一个包装器,在其中检查连接是否已经有效,并在需要时回收连接。如果查询挂在我身上,有时我需要断开连接然后重新连接才能使连接正常工作。
r - 更改不带引号的函数体
我需要根据用户给出的输入来更改函数的主体。
问题是更改后的函数包含引号。我该如何摆脱它们?
将用户输入评估为公式时,替换有效且不插入引号
但是,我需要使用<-或仅使用右侧。在这些情况下,会计算公式,这会产生错误。
我也试过noquote仍然给出引号:
最后,我尝试了expr(!!userinput)、subs()和替代的不同组合。
r - 使用 eval 和 parse 转义反斜杠(非标准评估)
我需要结合非标准评估使用正则表达式。
以下工作正常:
以下不起作用:
我在想我需要转义反斜杠本身,但是,这似乎也不起作用:
r - 为什么 `substitute` 可以在多行中工作,但不能在单行中工作?
我试图回答这个关于为 data.table 对象创建非标准评估函数的好问题,并进行分组求和。Akrun 想出了一个可爱的答案,我将在这里简化:
我也在研究一个答案,并且得到了接近相同的答案,但substitute
s 与其余的内联。我的结果是一个错误:
从表面上看,我的功能是对 Akrun 的简单替代。为什么它不起作用?
请注意,这两种替换都会导致问题,如下所示: