我正在寻找一种惯用的(基于管道的(方法来查找给定函数在一个区间中的最小值/最大值。假设我有一个任意函数,比如
f<-function(x){return(x^2-10*x)}
我在[xmin:xmax]中查找它的最小值。当然,对于上面的例子,这是微不足道的,但很明显,现实生活中的应用程序会使用更复杂的f,可能有参数等。
";普通的";R方式将是,例如(例如这里(
xmin <- 0
xmax <- 10
df<-curve(f,xmin,xmax)
df$x[which(df$y==(min(df$y,na.rm = TRUE)))]
或
optimize(f, interval=c(xmin,xmax), maximum=F)$min
为了好奇(和理解管道(,让我们假设我想要一个";整洁的";等效于第一个解决方案,使用管道。我设法建造了
seq(xmin,xmax,length.out = 100) %>% f %>% which.min()
这给了我最低值的索引。当然我现在可以做了
idx <- seq(xmin,xmax,length.out = 100) %>% f %>% which.min()
seq(xmin,xmax,length.out = 100)[idx]
但是,肯定有一种更惯用的方法来传递我的构建结果,并在没有中间变量(xmin、xmax和idx(的情况下获得X值?
(是的,我知道这只给了我一个近似值,接近我序列中最接近的一步,是的,这是一个有点解释的例子-我正在努力提高我对管道的理解(
这应该是
xmin <- 0
xmax <- 10
f<-function(x){
return(x^2-10*x)
}
curve(f,xmin,xmax) %>%
as_tibble() %>%
filter(y == min(y)) %>%
pull(x)
或:
curve(f,xmin,xmax) %>%
{.$x[which.min(.$y)]}