gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:46:47 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com