r - 这些是字符串还是变量?

标签 r ggplot2

来自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)

变量arrivalRateresponseTimemode不存在,但是某种程度上R知道要在data数据框中查找它们。我假设aes实际上接收字符串,然后使用类似eval的字符串对其进行处理。

R如何解析最终将某些文字解释为字符串的代码?

最佳答案

promise

当参数传递给函数时,它不作为值传递,而是作为一个promise传递,包括

  • 调用者用作实际参数的表达式或代码
  • 要在其中评估该表达式的环境,即。 call 者的环境。
  • 在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/

    相关文章:

    r - 将 .mat 文件转换为 R 兼容文件

    r - 如果所有列都包含 NA,则删除行中的 NA 值,但保留至少包含一个结果的行

    r - 直方图中不同的 bin 宽度与 ggplot2,r

    r - 使用注释时的ggmap和错误(geom = "text")

    r - tidyr::unite 的数据表版本

    将数据框中的某些值替换为 NA

    r - 使用 write.xlsx 处理空数据帧

    r - ggplot中每个方面的不同垂直线

    r - 使用 gganimate 时如何使 y 轴限制动态

    r - 从R中的函数绘制到文件