gpt4 book ai didi

r - 为什么惰性求值在这个 R 函数中不起作用?

转载 作者:行者123 更新时间:2023-12-04 05:32:33 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
How to write an R function that evaluates an expression within a data-frame



我想编写一个对 data.frame 进行排序的函数——而不是使用繁琐的 order()。鉴于类似
> x=data.frame(a=c(5,6,7),b=c(3,5,1))
> x
a b
1 5 3
2 6 5
3 7 1

我想说:
sort.df(x,b)

所以这是我的功能:
sort.df <- function(df, ...) {
with(df, df[order(...),])
}

我真的为此感到自豪。鉴于 R 的惰性求值,我认为 ... 参数只会在需要时求值——到那时它会在范围内,因为“with”。

如果我直接运行“with”行,它会起作用。但功能没有。
> with(x,x[order(b),])
a b
3 7 1
1 5 3
2 6 5
> sort.df(x,b)
Error in order(...) : object 'b' not found

出了什么问题,如何解决?例如,我经常在 plyr 之类的包中看到这种“魔法”。有什么诀窍?

最佳答案

这是因为当你传递 b 时,你实际上并没有传递一个对象。放一个 browser在你的函数中,你会明白我的意思。我从某个地方的某个互联网机器人那里偷了这个:

x=data.frame(a=c(5,6,7),b=c(3,5,1))

sort.df <- function(df, ..., drop = TRUE){
ord <- eval(substitute(order(...)), envir = df, enclos = parent.frame())
return(df[ord, , drop = drop])
}

sort.df(x, b)

将工作。

如果您正在寻找一种在应用意义上做到这一点的好方法,那么将如此:
library(taRifx)
sort(x, f=~b)

关于r - 为什么惰性求值在这个 R 函数中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com