如何在R中一步一步地查看一个函数的过程?

时间:2021-04-22 02:45:35

标签: r

DF:

df <- tibble(
  a = c("z", "x", "y"),
  b = c("m", "n", "o"),
  c = c("p", "q", "r")
)

-我想在以下位置查看 names(.)(检查)的结果:

df %>% 
  set_names(c(names(.)[1], unlist(.[2, 2:3])))

-我知道它是 c("a", "b", "c"),或者 unlist(.[2, 2:3]) 中的结果。这是一个例子,我想在 R 中的任何操作中应用这个想法。有什么东西吗?我想深入了解某个函数在做什么。

2 个答案:

答案 0 :(得分:0)

不确定这是否是您的想法,但 lobstr::ast() 显示了 R 创建的抽象语法树,用于确定调用中的各种输入和函数之间的关系。

https://medium.com/analytics-vidhya/become-a-better-r-programmer-with-the-awesome-lobstr-package-af97fcd22602

lobstr::ast(df %>% 
              set_names(c(names(.)[1], unlist(.[2, 2:3]))))


█─`%>%` 
├─df 
└─█─set_names 
  └─█─c 
    ├─█─`[` 
    │ ├─█─names 
    │ │ └─. 
    │ └─1 
    └─█─unlist 
      └─█─`[` 
        ├─. 
        ├─2 
        └─█─`:` 
          ├─2 
          └─3 

答案 1 :(得分:0)

也许您正在寻找@Moody_Mudskipper 的boomer package

boomerlogo.png

安装

使用 remotes::install_github("moodymudskipper/boomer") 安装

示例(来自 github):

library(boomer)
boom(1 + !1 * 2)
#> 1 * 2
#> [1] 2
#> !1 * 2
#> [1] FALSE
#> 1 + !1 * 2
#> [1] 1

boom(subset(head(mtcars, 2), qsec > 17))
#> head(mtcars, 2)
#>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
#> qsec > 17
#> [1] FALSE  TRUE
#> subset(head(mtcars, 2), qsec > 17)
#>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4

# You can use boom() with {magrittr} pipes, just pipe to boom() at the end of a pipe chain.
library(magrittr)
mtcars %>%
  head(2) %>%
  subset(qsec > 17) %>%
  boom()
#> head(., 2)
#>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
#> qsec > 17
#> [1] FALSE  TRUE
#> subset(., qsec > 17)
#>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
#> mtcars %>% head(2) %>% subset(qsec > 17)
#>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4

#If a call fails, {boomer} will print intermediate outputs up to the occurrence of the error, it can help with debugging:
"tomato" %>%
  substr(1, 3) %>%
  toupper() %>%
  sqrt() %>%
  boom()
#> substr(., 1, 3)
#> [1] "tom"
#> toupper(.)
#> [1] "TOM"
#> Error in .Primitive("sqrt")(.): non-numeric argument to mathematical function

Boomer 在执行中间步骤时打印它们的输出,因此不会说明未执行的内容,这与返回解析树的 lobstr::ast() 等函数形成对比。

>

显然,boomer 对 set_names 函数并不“友好”;这是一个类似的例子:

df %>% 
  names(.)[1] %>% 
  boom()
#>names(.)
#>[1] "a" "b" "c"
#>.[names(.), 1]
#> A tibble: 3 x 1
#>      a
#>  <dbl>
#>1    NA
#>2    NA
#>3    NA
#>df %>% names(.)[1]
#> A tibble: 3 x 1
#>      a
#>  <dbl>
#>1    NA
#>2    NA
#>3    NA
相关问题