首页 文章

rlang:现状,文档,发现的分配形式 . 或者其他的东西

提问于
浏览
0

许多帮助页面的示例采用了这样的形式,将现有的输出分配给quo:

quo <- quo(letters)
quo <- quo(toupper(!! quo))
quo
eval_tidy(quo)

很明显,这些赋值不会像通常那样覆盖quo函数(因为它连续两次) . 一流的对象,以及所有这些 .

所以我对正在发生的事情的最好猜测是,这不是一个正常的任务,而是现状的分配形式,现在< - . 但我还没有任何关于此的信息 .

非 生产环境 性:

getAnywhere(现状< - )
getAnywhere(现状<-
getAnywhere(quo <-
rlang :::现状< -
rlang :::现状<-
rlang :::quo <-

所以我想要一个可以告诉我作业形式是什么以及它如何运作的人,如果我所看到的不是作业形式,那么更是如此,而是相当一些方面“[q] uo self - 在自己的环境中评估 . “

最后,如果在某个地方有关于此功能或用法的可访问文档,我想知道我是如何找到它的,如果没有,我应该告诉哈德利 . 他如何保持这么多的盘子旋转而不会丢掉更多的球,这对我来说是一个完全的谜 .

1 回答

  • 2
    library(rlang)
    

    您刚刚附加 rlang ,您的搜索路径现在看起来像:

    search()
    #  [1] ".GlobalEnv"        "package:rlang"     "package:stats"    
    #  [4] "package:graphics"  "package:grDevices" "package:utils"    
    #  [7] "package:datasets"  "package:methods"   "Autoloads"        
    # [10] "package:base"
    

    如果您在命令行中以交互方式执行此操作,则应在 .GlobalEnv 中执行此操作:

    quo <- quo(letters)
    
    ls(.GlobalEnv)
    # [1] "quo"
    

    现在 quoget("quo") 开始在 .GlobalEnv 中搜索 quo ,在那里找到它(你刚刚创建的那个)并停止:

    quo
    get("quo")
    get("quo", .GlobalEnv)
    # <quosure: global>
    # ~letters
    

    如果要查找该功能,则必须绕过 .GlobalEnv 并在其封闭环境 package:rlang 中开始搜索 . 你很幸运,这就是它所在的地方:

    get("quo", as.environment("package:rlang"))
    # function (expr) 
    # {
    #     enquo(expr)
    # }
    # <environment: namespace:rlang>
    

    (哦,这个 namespace:rlang 你看到的不是我们找到的地方 quo ,而是它的封闭环境,即's going to start its own search when it'所谓的地方 . 查看世界 Map :
    http://blog.obeautifulcode.com/img/how-r-searches-and-finds-stuff/map-of-the-world.png
    来源:Suraj Gupta http://blog.obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/

    > sapply(search(), function(x) "quo" %in% ls(x))
           .GlobalEnv     package:rlang     package:stats  package:graphics 
                 TRUE              TRUE             FALSE             FALSE 
    package:grDevices     package:utils  package:datasets   package:methods 
                FALSE             FALSE             FALSE             FALSE 
            Autoloads      package:base 
                FALSE             FALSE
    

    如果你已经知道你正在寻找一个函数,你可以使用 pryr 中的方便 fget 来忽略所有不是函数的东西:

    pryr::fget("quo")
    # function (expr) 
    # {
    #     enquo(expr)
    # }
    # <environment: namespace:rlang>
    

    (注意:当您编写自己的函数时, match.fun 也可以派上用场) .

    或者你可以让R变聪明,并且直接使用parens,R会知道它必须寻找一个函数,这是在以下所做的:

    quo <- quo(toupper(!! quo))
    

    (还比较:

    > bar
    Error: object 'bar' not found
    > bar()
    Error in bar() : could not find function "bar"
    

    错误消息提示R无法找到/查找,有和没有parens . )


    现在为了好玩,让我们附上整个tidyverse:

    library(tidyverse)
    

    搜索路径变得更加混乱:

    search()
    #  [1] ".GlobalEnv"        "package:forcats"   "package:stringr"  
    #  [4] "package:dplyr"     "package:purrr"     "package:readr"    
    #  [7] "package:tidyr"     "package:tibble"    "package:ggplot2"  
    # [10] "package:tidyverse" "package:rlang"     "package:stats"    
    # [13] "package:graphics"  "package:grDevices" "package:utils"    
    # [16] "package:datasets"  "package:methods"   "Autoloads"        
    # [19] "package:base"
    

    如果我们很好奇并想知道找到 quo 的位置,我们可以使用 pryr 来自 pryr . 同样,我们应该绕过 .GlobalEnv 并从其封闭环境 package:forcats 开始,例如:

    pryr::where("quo", env = "package:forcats")
    # Using environment package:forcats
    # <environment: package:dplyr>
    # attr(,"name")
    # [1] "package:dplyr"
    # attr(,"path")
    # [1] "/home/aurele/R/x86_64-pc-linux-gnu-library/3.4/dplyr"
    

    惊喜, quo 现在在 package:dplyr 而不是 package:rlang 中找到 . 这是因为 package:dplyr 出现在搜索路径之前,并且当它发生时,它会从 rlang 重新导出 quo 以使其在 dplyr 中直接可用 .

    > sapply(search(), function(x) "quo" %in% ls(x))
           .GlobalEnv   package:forcats   package:stringr     package:dplyr 
                 TRUE             FALSE             FALSE              TRUE 
        package:purrr     package:readr     package:tidyr    package:tibble 
                FALSE             FALSE             FALSE             FALSE 
      package:ggplot2 package:tidyverse     package:rlang     package:stats 
                FALSE             FALSE              TRUE             FALSE 
     package:graphics package:grDevices     package:utils  package:datasets 
                FALSE             FALSE             FALSE             FALSE 
      package:methods         Autoloads      package:base 
                FALSE             FALSE             FALSE
    

相关问题