You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

语法名称为何不使用字符串引号?单双引号与反引号的使用差异

R语言中引号与反引号的使用差异:弊端与适用场景

用单/双引号替代反引号作为函数名的弊端

  • 语义模糊,可读性差:反引号的作用是明确标记「非标准语法的函数/对象名」,而单/双引号本质是表示字符串。当你在apply里传"*"时,是依赖match.fun的隐式转换把字符串转成函数,和直接用`*`引用函数对象是完全不同的逻辑——前者传的是字符串,后者传的是函数本身,容易让其他开发者误解代码意图。
  • 场景局限性:不是所有场景都能用引号替代反引号。比如直接调用运算符函数时,你不能写"%x%"(a, b),必须用`%x%`(a, b)或者a %x% b;另外,若要在代码中直接引用和R关键字重名的函数(比如`if`),用引号会直接报错,只有反引号能生效。
  • 错误反馈滞后:用引号传递函数名时,R要等到match.fun执行时才会检查字符串对应的函数是否存在;而用反引号的话,R在解析代码阶段就会校验函数是否存在,错误能更早暴露,排查更高效。
  • 不符合编码规范:主流R编码规范(如Tidyverse风格指南)明确推荐:反引号用于标记非标准命名的对象/函数,引号用于表示字符串。混用会破坏代码风格的一致性,降低团队协作的效率。

不同引号类型的适用场景

反引号(`)

  • 定义或引用非标准语法的函数/对象名:比如包含空格、特殊字符(如%、-)、与R关键字(如if、else)重名的名字,例如:
    `my custom function` <- function(x) x*2
    `if` <- function(x) print("not the keyword if")
    
  • 直接调用非常规命名的函数,确保语法合法:例如`%x%`(a, b)

单/双引号('/")

  • 将函数名作为字符串参数传递给支持字符串转函数的工具函数:比如apply、do.call、match.fun、purrr::map等,这些函数内部会自动把字符串转换为对应的函数对象,例如:
    do.call("sum", list(1:10))
    purrr::map(1:3, "sqrt")
    
  • 注意:虽然用引号能定义非常规命名的函数,但这是R的特殊语法兼容,并非设计初衷,不推荐使用。

无引号

  • 直接使用标准语法的函数名:比如sum、mean、lm这类符合R命名规则(由字母、数字、下划线组成,首字符为字母)的函数,直接调用即可,无需任何引号或反引号。

示例代码验证

A <- matrix(1:4, 2)
B <- matrix(4:1, 2)
apply(A, 2, `*`, B)  # 直接引用乘法函数对象
apply(A, 2, "*", B)  # 传递字符串,依赖match.fun转换
apply(A, 2, '*', B)  # 单引号效果同双引号
# apply(A, 2, *, B)  # 直接写*会触发语法错误

`%x%` <- function(lhs, rhs) lhs * rhs  # 标准的非常规函数定义方式
"%x%" <- function(lhs, rhs) lhs * rhs  # 兼容写法,但不推荐
'%x%' <- function(lhs, rhs) lhs * rhs  # 单引号兼容写法,同样不推荐
# %x% <- function(lhs, rhs) lhs * rhs  # 无引号会触发语法错误

内容的提问来源于stack exchange,提问作者GKi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:17:38