在区间内找到函数最大值的简洁方法:管道、序列和子集
A tidy way to find the max of a function in an interval: pipes, sequences and subsetting
我正在寻找一种惯用的(基于管道的)方法来查找区间内给定函数的 minimum/maximum。假设我有一个任意函数,例如
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)]}
我正在寻找一种惯用的(基于管道的)方法来查找区间内给定函数的 minimum/maximum。假设我有一个任意函数,例如
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)]}