将参数传递给使用替代的函数

Pass arguments to function which uses substitute

我想为 reprex 创建一个小包装器,将输入代码传递给 reprex::reprex()。 由于 reprex 在其 x 参数上使用 substitute(),我需要以某种方式转义它。

MWE

这是一个最小的工作示例,其中 internal_foo() 充当 reprex() 的代理。 预期的结果是对 internal_foo(...)wrapper(...) return 的调用具有相同的输出。

internal_foo <- function(x) {
  res <- substitute(x)
  res
}

# the expected output! ------
internal_foo({
  a <- 1:10
  b <- rnorm(10)
  plot(a, b)
})
#> {
#>   a <- 1:10
#>   b <- rnorm(10)
#>   plot(a, b)
#> }

wrapper <- function(x = NULL) {
  # pass x to internal_foo in such a way that it has the same output as calling internal_foo directly
  internal_foo(deparse(x))
}
wrapper({
  a <- 1:10
  b <- rnorm(10)
  plot(a, b)
})
#> deparse(x)
# clearly not equal to the expected output ----

由于 Rs 的惰性求值,x 没有按照我的意图传递给 internal_foo()

我尝试过 eval、deparse 和 substitute,但找不到合适的组合。

更复杂的 reprex 示例

实际目标是这个 reprex 包装器。

wrapper2 <- function(x, input = NULL) {
  reprex::reprex(x = x, input = input, venue = "r", html_preview = FALSE)
}
wrapper2({
    a <- 1:10
    b <- rnorm(10)
    plot(a, b)
})

wrapper2 呈现 reprex 并将其复制到剪贴板但显示 Error in eval object x not found.

你可以

wrapper2 <- function(..., input = NULL) {
  reprex::reprex(..., 
                 input = input, 
                 venue = "r", 
                 html_preview = FALSE)
}

wrapper2({
  a <- 1:10
  b <- rnorm(10)
  plot(a, b)
})

#> i Rendering reprex...
#> √ Reprex output is on the clipboard.

输出:

a <- 1:10
b <- rnorm(10)
plot(a, b)

#' ![](agile-pike_reprex_files/figure-gfm/unnamed-chunk-2-1.png)