来自C / Python / Java背景,我很难理解某些R语法,其中的文字看起来像变量,但表现得像字符串。例如:
library(ggplot2)
library("ggplot2")
这两行的行为相同。但是,我希望第一行的意思是“加载名称存储在ggplot2变量中的库”,并给出类似
object 'ggplot2' not found
的错误。说到ggplot2:
ggplot(data, aes(factor(arrivalRate), responseTime, fill=factor(mode))) +
geom_violin(trim=FALSE, position=dodge)
变量
arrivalRate
,responseTime
和mode
不存在,但是某种程度上R知道要在data
数据框中查找它们。我假设aes
实际上接收字符串,然后使用类似eval
的字符串对其进行处理。R如何解析最终将某些文字解释为字符串的代码?
最佳答案
promise
当参数传递给函数时,它不作为值传递,而是作为一个promise传递,包括
pryr软件包可以按 promise 显示信息:
library(pryr)
g <- function(x) promise_info(x)
g(ggplot2)
给予:
$code
ggplot2 <-- the promise x represents the expression ggplot2
$env
<environment: R_GlobalEnv> <-- if evaluated it will be done in this environment
$evaled
[1] FALSE <-- it has not been evaluated
$value
NULL <-- not filled in because promise has not been evaluated
可以在R级别访问pryr输出中的上述插槽中的唯一插槽,而无需编写C函数来执行此操作(或使用访问此类C代码的pryr之类的程序包)就是代码插槽。可以使用R函数
substitute(x)
(或其他方式)完成此操作。根据应用于 promise 的pryr输出substitute
返回代码位而不评估 promise 。即,值槽未被修改。如果我们以普通方式(即不通过x
)访问substitute
,则该代码将在promise的环境中进行评估,存储在值槽中,然后传递给访问它的函数中的表达式。因此,以下任一结果都将导致一个字符串,该字符串表示作为表达式传递的内容,即代码槽的字符表示形式,而不是其值。
f <- function(x) as.character(substitute(x))
f("ggplot2")
## [1] "ggplot2"
f(ggplot2)
## [1] "ggplot2"
图书馆
实际上,
library
使用此惯用语as.character(substitute(x))
来处理其第一个参数。es
aes
函数使用match.call
将整个调用作为表达式获取,因此在某种意义上是substitute
的替代方法。例如:h <- function(x) match.call()
h(pi + 3)
## h(x = pi + 3)
注意
如果不查看函数的文档或代码,就无法说出它将如何对待其参数。
关于r - 这些是字符串还是变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480799/