R 将函数映射到向量上

R 将函数映射到向量上,r,dplyr,tidyverse,purrr,R,Dplyr,Tidyverse,Purrr,我有以下x和y: set.seed(1234) x <- seq(1, 1000, 1) y <- rnorm(1000) 问题是我需要每次修改nknots来适应这个模型。表示结的向量如下所示: myknots <- seq(5, 15, 1) myknots对于purrr,我们使用map library(purrr) map(myknots, ~ myfoo(x, y, nknots = .x)) 使用一行程序中的base::Vectorize,您可以做到这一点,而不

我有以下
x
y

set.seed(1234)
x <- seq(1, 1000, 1)
y <- rnorm(1000)
问题是我需要每次修改
nknots
来适应这个模型。表示结的向量如下所示:

myknots <- seq(5, 15, 1)

myknots对于
purrr
,我们使用
map

library(purrr)
map(myknots,  ~ myfoo(x, y, nknots = .x))

使用一行程序中的base::Vectorize,您可以做到这一点,而不需要加载额外的包,也不需要依赖它们永远不会更改:

> alls = Vectorize(smooth.spline,"nknots",SIMPLIFY=FALSE)(x=x,y=y,nknots=myknots)
这将返回一个列表,其中每个元素都是
平滑的。对于
myknots
的每个值,样条线
输出:

> alls[[1]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.1318881  lambda= 0.01540768 (14 iterations)
Equivalent Degrees of Freedom (Df): 5.244268
Penalized Criterion (RSS): 984.4824
GCV: 0.99489
> alls[[2]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.2285265  lambda= 0.03658625 (12 iterations)
Equivalent Degrees of Freedom (Df): 5.006371
Penalized Criterion (RSS): 984.8108
GCV: 0.994746

将依赖关系保持在最低限度是一种很好的做法。

你可以做
lappy(myknots,function(k)myfoo(x=x,y=x,nknots=k))
你的函数
myfoo
没有帮助。您可以执行lappy(myknots,function(k){smooth.spline(x=x,y=y,nknots=k)})
> alls = Vectorize(smooth.spline,"nknots",SIMPLIFY=FALSE)(x=x,y=y,nknots=myknots)
> alls[[1]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.1318881  lambda= 0.01540768 (14 iterations)
Equivalent Degrees of Freedom (Df): 5.244268
Penalized Criterion (RSS): 984.4824
GCV: 0.99489
> alls[[2]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.2285265  lambda= 0.03658625 (12 iterations)
Equivalent Degrees of Freedom (Df): 5.006371
Penalized Criterion (RSS): 984.8108
GCV: 0.994746