mah*_*hin 14 closures functional-programming r
我正在尝试编写一个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
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Error in rep(yes, length.out = length(ans)) :
attempt to replicate an object of type 'closure'
Run Code Online (Sandbox Code Playgroud)
我尝试了其他几个版本,但它们都给了我同样的错误.我究竟做错了什么?
编辑:我意识到代码不太实用.我的目标是更好地理解函数式编程.我在SAS写了一个类似的宏,我只是想在R中编写它的对应物,但我失败了.我刚刚选这个作为例子.我认为这是一个非常简单的例子,但它不起作用.
GSe*_*See 15
有一些小问题. ifelse
是一个矢量化函数,但你只需要一个简单的函数if
.实际上,您实际上并不需要else
- 如果数据集不存在,您可能会立即抛出错误.请注意,您的错误消息未使用对象的名称,因此它将创建自己的错误.
你正在过去a
,b
而不是"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)
Run Code Online (Sandbox Code Playgroud)