bounty还有3天到期。此问题的答案有资格获得+50声望奖励。GKi希望引起更多关注这个问题。
我已经为syntactic name或name of a function使用了双引号,并得到了一个注解 * 使用反引号 。这里我得到了一个评论, 将函数名作为字符串传递给match.fun
(因此*apply
函数或do.call
)是完全可以的。
A <- matrix(1:4, 2)
B <- matrix(4:1, 2)
apply(A, 2, `*`, B) # Works: backtick quotes
apply(A, 2, "*", B) # Works: double quotes
apply(A, 2, '*', B) # Works: single quotes
# apply(A, 2, *, B) # Error: unexpected '*' in "apply(A, 2, *"
`%x%` <- function(lhs, rhs) lhs * rhs # Works: backtick quotes
"%x%" <- function(lhs, rhs) lhs * rhs # Works: double quotes
'%x%' <- function(lhs, rhs) lhs * rhs # Works: single quotes
# %x% <- function(lhs, rhs) lhs * rhs # Error: unexpected SPECIAL in "%x%"
我想知道函数名使用单引号'
或双引号"
而不是反引号```有什么缺点?在哪些情况下应使用哪种报价类型?
3条答案
按热度按时间smtd7mpg1#
Hadley威克姆的Advanced R的第2.2.1节:
您还可以使用单引号或双引号创建非语法绑定(例如
"_abc" <- 1
)而不是反引号,但不应该这样做,因为必须使用不同的语法来检索值。在赋值箭头的左手使用字符串的能力是一个历史性的人工制品,在R支持反引号之前使用。?Quotes
(我的粗体):标识符由一系列字母、数字、句点(.)和下划线组成。它们不能以数字或下划线开头,也不能以句点后跟数字开头。保留字不是有效的标识符。
...
这样的标识符也被称为语法名称,并且可以直接在R代码中使用。几乎总是可以使用其他名称,只要它们被引用。首选的引号是反引号(' ` '),deparse通常会使用它,但在许多情况下,可以使用单引号或双引号(因为字符常量通常会转换为名称)。反引号可能必不可少的一个地方是在公式中分隔变量名:参见公式。
piztneat2#
必须强调的是
和
本身是两个不同的对象:前者是一个函数,而后者只是一个特征向量。使用一个或另一个是否有任何区别,这取决于用例。因为在大多数情况下,当你将一个函数传递给另一个函数时,通常会调用
match.fun
(这发生在*apply
,do.call
和基本上任何接受函数作为参数的基函数上),传递任何一个对象都没有任何区别。但是,如果您使用外部包或其他源中的某些函数,则无法确保执行了对match.fun
的调用。例如,假设你有这个函数:这个方法的作用是:
这不会:
另一点:R中的一切都是函数,甚至赋值。所以当你使用像这样的东西:
解析器将上述指令转换为:
在这个函数中,对
as.symbol
的隐式调用是在var
上执行的,因此下面的语法是有效的:但是和以前一样,
foo
和"foo"
仍然是不同的对象。match.fun
的另一个隐式用法发生在调用函数时。当我们像对待函数一样对待符号时,表达式的求值会查找函数而不是泛型对象。例如:错误消息很清楚:这并不是因为
a
不是一个函数对象,而是因为一个名为a
的模式函数对象不存在。例如,我们可以声明像基函数一样命名的对象,并且解析器仍然会在调用时调用该函数:当解析器理解我们正在调用一个函数时,它调用
match.fun
。这个方法的作用是:当然,这不会:
hof1towb3#
使用双引号会给静态分析带来挑战。
另一方面,双引号/单引号给予了更好的跟踪,在一些旧版本的R中,下面的漂亮版本也更快。
创建于2023-06-03带有reprex v2.0.2
"this that" <- 1
实际上看起来更好,因为你可以看到一些时髦的事情正在发生c("x_a" = "y_a", "x_b" = "y_b")
用于连接,它更对称我们在这里讨论过:https://twitter.com/antoine_fabri/status/1579863982294601728