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

为何在R的require与select函数中可无引号引用对象?

问题解答

先整理你的R会话代码:

bash$ R

R version 4.1.3 (2022-03-10) -- "One Push-Up"
Copyright (C) 2022 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

> require(dplyr)
Loading required package: dplyr

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

> x <- select(starwars, name)
> y <- select(starwars, 'name')
> assertthat::are_equal(x, y)
[1] TRUE

这两种写法效果一致,核心都是**非标准计算(NSE)**的作用,不过两者的实现逻辑略有区别:

1. require(dplyr) 不带引号的原因

基础R的require()和library()函数本身支持非标准计算。当你传入不带引号的符号(比如dplyr)时,函数内部会通过deparse(substitute(package))这类操作,把这个符号转换成对应的字符串,再去系统中查找同名的R包。简单说就是函数自动帮你把裸符号转成了字符串,所以require(dplyr)和require("dplyr")完全等价。

2. select(starwars, name) 不带引号的原因

dplyr的select()属于tidyverse工具链,它用的是整洁评估(tidy evaluation)——这是tidyverse对非标准计算的一套扩展实现。函数内部会借助rlang包的工具(比如ensym())把你传入的裸符号name转换成字符串,然后匹配starwars数据框里的列名。这套设计就是为了让代码更简洁,不用反复写引号,所以select(starwars, name)和select(starwars, 'name')结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:20:31