从chernan's sample REST queries获取的以下代码块将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)
}
答案 0 :(得分:4)
*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
答案 1 :(得分:0)
names(parameters)
正在传递给param_name
。一个更基本的例子:sapply(df1, mean)
。含义为sapply(df1, function(x) mean(x))
。在这种情况下,df1的每个元素都作为参数mean
传递给x
。 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)
隐含地是第一个参数)。