lapply 带有可选的函数参数和可选的向量参数
lapply with optional function argument and optional vector arguments
我在 R 中有一个函数,比方说
f1 <- 函数(x,y,vec, func0,...){
...
...
...
return(出局)
}
这个函数f1中的参数func0和vec分别是函数对象和一些向量对象。现在我想重复这个函数 'reps' 次(其他都一样)。我已将此函数的参数存储在一个列表中,因为有很多参数,我不断更改它们以再次进行复制。
list1 <- list(x,y,vec, func0, 其他参数)
那我想做的,
f1_reps <- lapply(1:reps, f1, list1)
执行此操作时出现错误,因为找不到函数参数 func0 和 vec。
这方面的任何帮助都会有所帮助。这是情况的模拟示例。
这是一个例子,
a <- function(n){
sqrt(n)
}
N = 100
out <- rep(NA,N)
# simple function with multiple arguments
foo <- function(a=a, b= c(1:3), c= 1000){
for(n in 1:N){
out[n] <- b%*%b+ a(n)*c
}
return(out)
}
candidates <- list(a=a, b = c(1:3), c=1000)
lapply(1:4, foo(a=candidates$a,b=candidates$b,c=candidates$c)) ## Doesn't work
lapply(1:4, foo, a=candidates$a, b=candidates$b, c=candidates$c) ## Doesn't work
candidates2 <- c(a=a, b = c(1:3), c=1000) # A vector of arguments
lapply(1:4, foo, a=candidates2$a, b = c(candidates2$b1,candidates2$b2,candidates2$b3), c=candidates2$c) #Doesn't work either
主要问题是您的函数 f1
接受变量输入,而不是变量列表。这是您可以使用的一种方法,例如,如果我正确理解了您的输入是如何存储的
# simple function with multiple arguments
foo <- function(a=1, b=2, c=3){
return(a+b+c)
}
# works
foo(a=1, b=2, c=3)
# doesn't work as not required format
foo(list(a=1, b=2, c=3))
# formatted list such that each element has 5 elements
candidates <- list(
a=1:5,
b=2:6,
c=3:7
)
# you need to apply the variables one by one with this setup
N <- 5
out <- lapply(1:N, function(i){
foo(a=candidates$a[i]
,b=candidates$b[i]
,c=candidates$c[i])
})
out
这使用 dots
又名 ...
参数:
foo2 <- function(...) {
#I just returns the identity
l <- lapply(..., I)
a <- l[[1]]
b <- l[[2]]
c <- l[[3]]
for(n in 1:N){
out[n] <- b%*%b+ a(n)*c
}
return(out)
}
candidates <- list(a=a, b = c(1:3), c=1000)
foo2(candidates)
# or to simplify. Same output as previous.
c(crossprod(1:3)) + sqrt(seq_len(100)) * 1000
[1] 1014.000 1428.214 1746.051 2014.000 2250.068 2463.490 2659.751 2842.427 3014.000 3176.278 3330.625 3478.102 3619.551 3755.657
[15] 3886.983 4014.000 4137.106 4256.641 4372.899 4486.136 4596.576 4704.416 4809.832 4912.979 5014.000 5113.020 5210.152 5305.503
[29] 5399.165 5491.226 5581.764 5670.854 5758.563 5844.952 5930.080 6014.000 6096.763 6178.414 6258.998 6338.555 6417.124 6494.741
[43] 6571.439 6647.250 6722.204 6796.330 6869.655 6942.203 7014.000 7085.068 7155.428 7225.103 7294.110 7362.469 7430.198 7497.315
[57] 7563.834 7629.773 7695.146 7759.967 7824.250 7888.008 7951.254 8014.000 8076.258 8138.038 8199.353 8260.211 8320.624 8380.600
[71] 8440.150 8499.281 8558.004 8616.325 8674.254 8731.798 8788.964 8845.761 8902.194 8958.272 9014.000 9069.385 9124.434 9179.151
[85] 9233.544 9287.618 9341.379 9394.832 9447.981 9500.833 9553.392 9605.663 9657.651 9709.360 9760.794 9811.959 9862.858 9913.495
[99] 9963.874 10014.000
我在 R 中有一个函数,比方说
f1 <- 函数(x,y,vec, func0,...){
...
...
...
return(出局)
}
这个函数f1中的参数func0和vec分别是函数对象和一些向量对象。现在我想重复这个函数 'reps' 次(其他都一样)。我已将此函数的参数存储在一个列表中,因为有很多参数,我不断更改它们以再次进行复制。
list1 <- list(x,y,vec, func0, 其他参数)
那我想做的, f1_reps <- lapply(1:reps, f1, list1)
执行此操作时出现错误,因为找不到函数参数 func0 和 vec。
这方面的任何帮助都会有所帮助。这是情况的模拟示例。
这是一个例子,
a <- function(n){
sqrt(n)
}
N = 100
out <- rep(NA,N)
# simple function with multiple arguments
foo <- function(a=a, b= c(1:3), c= 1000){
for(n in 1:N){
out[n] <- b%*%b+ a(n)*c
}
return(out)
}
candidates <- list(a=a, b = c(1:3), c=1000)
lapply(1:4, foo(a=candidates$a,b=candidates$b,c=candidates$c)) ## Doesn't work
lapply(1:4, foo, a=candidates$a, b=candidates$b, c=candidates$c) ## Doesn't work
candidates2 <- c(a=a, b = c(1:3), c=1000) # A vector of arguments
lapply(1:4, foo, a=candidates2$a, b = c(candidates2$b1,candidates2$b2,candidates2$b3), c=candidates2$c) #Doesn't work either
主要问题是您的函数 f1
接受变量输入,而不是变量列表。这是您可以使用的一种方法,例如,如果我正确理解了您的输入是如何存储的
# simple function with multiple arguments
foo <- function(a=1, b=2, c=3){
return(a+b+c)
}
# works
foo(a=1, b=2, c=3)
# doesn't work as not required format
foo(list(a=1, b=2, c=3))
# formatted list such that each element has 5 elements
candidates <- list(
a=1:5,
b=2:6,
c=3:7
)
# you need to apply the variables one by one with this setup
N <- 5
out <- lapply(1:N, function(i){
foo(a=candidates$a[i]
,b=candidates$b[i]
,c=candidates$c[i])
})
out
这使用 dots
又名 ...
参数:
foo2 <- function(...) {
#I just returns the identity
l <- lapply(..., I)
a <- l[[1]]
b <- l[[2]]
c <- l[[3]]
for(n in 1:N){
out[n] <- b%*%b+ a(n)*c
}
return(out)
}
candidates <- list(a=a, b = c(1:3), c=1000)
foo2(candidates)
# or to simplify. Same output as previous.
c(crossprod(1:3)) + sqrt(seq_len(100)) * 1000
[1] 1014.000 1428.214 1746.051 2014.000 2250.068 2463.490 2659.751 2842.427 3014.000 3176.278 3330.625 3478.102 3619.551 3755.657
[15] 3886.983 4014.000 4137.106 4256.641 4372.899 4486.136 4596.576 4704.416 4809.832 4912.979 5014.000 5113.020 5210.152 5305.503
[29] 5399.165 5491.226 5581.764 5670.854 5758.563 5844.952 5930.080 6014.000 6096.763 6178.414 6258.998 6338.555 6417.124 6494.741
[43] 6571.439 6647.250 6722.204 6796.330 6869.655 6942.203 7014.000 7085.068 7155.428 7225.103 7294.110 7362.469 7430.198 7497.315
[57] 7563.834 7629.773 7695.146 7759.967 7824.250 7888.008 7951.254 8014.000 8076.258 8138.038 8199.353 8260.211 8320.624 8380.600
[71] 8440.150 8499.281 8558.004 8616.325 8674.254 8731.798 8788.964 8845.761 8902.194 8958.272 9014.000 9069.385 9124.434 9179.151
[85] 9233.544 9287.618 9341.379 9394.832 9447.981 9500.833 9553.392 9605.663 9657.651 9709.360 9760.794 9811.959 9862.858 9913.495
[99] 9963.874 10014.000