[英]How does sapply() apply a function with undefined (with no default) parameters
以下來自chernan的示例REST查詢的代碼塊將FUN應用於參數列表,但未提供“ param_name”。 這怎么可能?
rcurl_request <- function(service_url, parameters) {
# Collapse all parameters into one string
all_parameters <- paste(
sapply(names(parameters),
FUN=function(param_name, parameters) {
paste(param_name, paste(parameters[[param_name]], collapse=','), collapse='', sep='=')
},
parameters),
collapse="&")
# Paste base URL and parameters
requested_url <- paste0(service_url, all_parameters)
# Encode URL (in case there would be any space character for instance)
requested_url <- URLencode(requested_url)
# Start request to service
response <- getURL(requested_url, .opts = list(ssl.verifypeer = FALSE))
return(response)
}
*apply
函數系列旨在將FUN
應用於提供給相應*apply
函數的對象的元素。
在您的示例中,應用FUN
的元素是names(parameters)
的各個元素。 sapply()
接受第一個元素, names(parameters)[1]
,並將其作為第一個參數傳遞給FUN
。 因此, param_name
用於引用names(parameters)[1]
,然后引用names(parameters)[2]
,依此類推。
換句話說, sapply()
安排將sapply()
第一個參數的元素依次傳遞給FUN
提供這些元素作為FUN
的第一個參數。
您可以通過以下簡單示例更清楚地看到這一點:
sapply(1:10, FUN = function(i) {writeLines(paste("working on", i)); i})
因此, i
依次采用值1、2,...,10,並且匿名函數在每個值上起作用:
> sapply(1:10, FUN = function(i) {writeLines(paste("working on", i)); i})
working on 1
working on 2
working on 3
working on 4
working on 5
working on 6
working on 7
working on 8
working on 9
working on 10
[1] 1 2 3 4 5 6 7 8 9 10
names(parameters)
被傳遞給param_name
。 一個更基本的示例: sapply(df1, mean)
。 含義是sapply(df1, function(x) mean(x))
。 在這種情況下,df1的每個元素都作為參數x
傳遞給mean
。 apply函數采用第一個參數,並將其傳遞給指定的函數(apply函數的第二個參數)
例如:
sapply(mtcars, mean)
mpg cyl disp hp drat wt qsec
20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750
vs am gear carb
0.437500 0.406250 3.687500 2.812500
同樣, sapply()
構造為sapply(x, FUN,...)
...
是傳遞給函數FUN
任何其他參數。 在您的示例中, parameters
作為第二個參數傳遞( names(parameters)
隱式是第一個)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.