三行代码  ›  专栏  ›  技术社区  ›  Aella

使用cat或打印方法打印部分内容的子集闭包

oop r
  •  1
  • Aella  · 技术社区  · 2 月前

    我想创建打印方法、打印对象类、颜色和3d曲面公式。 然而,在对象调用中,这个曲面公式需要保持现在的样子,这就是为什么 body substitute 已使用。 所以我的方法正确地打印了类和颜色,但对于曲面公式 cat 不起作用 print 给出以下输出,即 closure :

    function (x, y) 1+5*exp(-x^2 - y^2) <environment: 0x0000020dd971cd10>

    我无法将此闭包转换为字符串或将其子集以仅提取曲面公式 1+5*exp(-x^2 - y^2) 请帮忙。。

    # object template
    chrt <- function(domain, n, f, col, ...) {
      x <- y <- seq(min(domain), max(domain), length.out = n)
      fun <- function(x, y) {}
      body(fun) <- substitute(f)
      structure(list(x = x, 
                     y = y, f = fun, col=col, ...), 
                class = "mychr")
    }
    
    # print method
    print.mychr <- function(object) {
      `%G%` <- paste0
      cat("\nObject has class: " %G% class(object) %G% 
            ", color: " %G% as.character(object$col) %G% "\n\n")
      print(object$f)
    }
    # object call
    chr1 <- chrt(c(-6, 6), 
                 n = 30, 
                 1+5*exp(-x^2 - y^2),
                 col = 'blue')
    print(chr1)
    
    2 回复  |  直到 2 月前
        1
  •  2
  •   jay.sf    2 月前

    使用 as.list 并打印第三个元素,即公式。

    print.mychr <- function(object) {
      `%G%` <- paste0
      cat("\nObject has class: " %G% class(object) %G% 
            ", color: " %G% as.character(object$col) %G% "\n\n")
      print(as.list(object$f)[[3]])
    }
    
    print(chr1)
    # Object has class: mychr, color: blue
    # 
    # 1 + 5 * exp(-x^2 - y^2)
    
        2
  •  0
  •   Allan Cameron    2 月前

    你可以 deparse 这个 body 属于 f 要将其转换为字符:

    print.mychr <- function(object) {
      `%G%` <- paste0
      cat("\nObject has class: ", class(object),
            ", color: ", as.character(object$col),
            ", formula: ", deparse(body(object$f)))
    }
    
    # object call
    chr1 <- chrt(c(-6, 6), 
                 n = 30, 
                 1+5*exp(-x^2 - y^2),
                 col = 'blue')
    print(chr1)
    #> 
    #> Object has class:  mychr , color:  blue , formula:  1 + 5 * exp(-x^2 - y^2)
    

    于2022年5月28日由 reprex package (v2.0.1)