2017-07-28 44 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)隱式地是第一個參數)。

相關問題