2017-07-28 73 views
0

以下代码块取自chernan's sample REST queries将对参数列表应用FUN,但未提供“param_name”。这怎么可能?sapply()如何应用未定义(无默认)参数的函数

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) 
} 

回答

4

*apply系列功能旨在将FUN应用于提供给相应功能的对象元素。

在您的示例中,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 
0

names(parameters)被传递给param_name。更基本的例子:sapply(df1, mean)。含义是sapply(df1, function(x) mean(x))。在这种情况下,将df1的每个元素作为参数x传递给mean。该应用功能采取的第一个参数,并把它传递给指定功能(一个应用功能的第二个参数)

例如:

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)隐式地是第一个参数)。