代码之家  ›  专栏  ›  技术社区  ›  yake84

使用addTaskCallback打印数据帧分配

r
  •  0
  • yake84  · 技术社区  · 2 年前

    当我以交互方式运行代码时,我有一个打印数据帧的技巧,如果在渲染的文档中,则不打印数据帧,但我希望这种情况在后台发生。

    当前解决方案:

    iprint <- function(x) { # only prints when interactive & not on render
      if (interactive()) {
        print(x)
      } else {
        invisible(x)
      }
    }
    
    x <-
      mtcars |>
      iprint()
    

    尝试使用任务回调但不起作用:

    addTaskCallback(
      name = "head_df",
      function(...) { 
        expr <- expression(...)[[1]]
        if (expr[[1]] == "<-") {                    # if it is an assignment
          if (inherits(expr[[3]], "data.frame")) {  # and a data frame
            head(expr[[3]])                         # print the data frame
          }
        }
      }
    )
    
    
    head(mtcars)      # shouldn't print bc no assignment
    
    x <- head(mtcars) # should print
    

    我有更多的逻辑来使它成为一个函数,如果事情是交互式的,可以考虑打开/关闭回调等。只是想让任务回调正常工作。

    0 回复  |  直到 2 年前
        1
  •  2
  •   Jonathan    2 年前

    一个绝妙的主意!以下是一种利用任务回调的其他参数的方法:

    addTaskCallback(
        name = "head_df",
        function(expr, result, complete, printed, ...) { 
          if (!printed && inherits(result, "data.frame")) {
              print(head(result))
          }
          TRUE
        }
      )
    

    这基本上是说“如果任务的结果是一个数据帧,但数据帧不会打印出来,就打印出来”。这将涵盖分配以及其他通常不会打印结果的操作。

    如果你真的想这么做 只是 对于任务,你可能会发现 deparse 有帮助,因此您可以比较 <- 符号到字符串。