【问题标题】:In R, getting the following error: "attempt to replicate an object of type 'closure'"在 R 中,出现以下错误:“尝试复制‘闭包’类型的对象”
【发布时间】:2013-07-15 03:54:28
【问题描述】:

我正在尝试编写一个 R 函数,该函数接受一个数据集并输出 plot() 函数以及在其环境中读取的数据集。这意味着您不必再使用 attach(),这是一种很好的做法。这是我的例子:

mydata <- data.frame(a = rnorm(100), b = rnorm(100,0,.2))
plot(mydata$a, mydata$b) # works just fine

scatter_plot <- function(ds) { # function I'm trying to create
    ifelse(exists(deparse(quote(ds))),
        function(x,y) plot(ds$x, ds$y),
            sprintf("The dataset %s does not exist.", ds))
    }

scatter_plot(mydata)(a, b) # not working

这是我得到的错误:

rep 中的错误(是,length.out = length(ans)) : 尝试复制“闭包”类型的对象

我尝试了其他几个版本,但它们都给了我同样的错误。我做错了什么?

编辑:我意识到代码不太实用。我的目标是更好地理解函数式编程。我在 SAS 中写了一个类似的宏,我只是想在 R 中写对应的宏,但我失败了。我只是选择了这个作为例子。我认为这是一个非常简单的示例,但它不起作用。

【问题讨论】:

  • 你的代码试图做的事情太不合常规了。你能说出你想要达到的目标吗?

标签: r functional-programming closures


【解决方案1】:

有一些小问题。 ifelse 是一个矢量化函数,但您只需要一个简单的if。事实上,您并不需要else——如果数据集不存在,您可以立即抛出错误。请注意,您的错误消息没有使用对象的名称,因此它会创建自己的错误。

您传递的是ab,而不是"a""b"。在编程时应该使用ds[[x]] 语法而不是ds$x 语法(fortunes::fortune(312))。如果这是您想要调用函数的方式,那么您也必须解析这些参数。最后,我想你想要deparse(substitute()) 而不是deparse(quote())

scatter_plot <- function(ds) {
  ds.name <- deparse(substitute(ds))
  if (!exists(ds.name))
    stop(sprintf("The dataset %s does not exist.", ds.name))
  function(x, y) {
    x <- deparse(substitute(x))
    y <- deparse(substitute(y))
    plot(ds[[x]], ds[[y]])
  }
}
scatter_plot(mydata)(a, b)

【讨论】:

  • 我在使用 ifelse 之后来到了这里,而我本应该使用 if - 这解决了问题。
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多