2017-07-28 5 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ファミリの関数は、それぞれ*apply関数に供給されるオブジェクトの要素にFUNを適用するように設計されています。あなたの例では

FUNが適用される要素がnames(parameters)個々要素です。 sapply()は最初の要素であるnames(parameters)[1]をとり、最初の引数としてFUNに渡します。したがってparam_namenames(parameters)[1]を指し、次にnames(parameters)[2]を指します。すなわち

sapply()FUNの最初の引数として、これらの要素を供給FUNに、順番に、sapply()の最初の引数の要素を通過するように配置します。

あなたはこの単純な例でより明確にこれを見ることができます:

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()...は、追加されsapply(x, FUN,...)として構成され、また

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 

:適用機能は、(適用関数の第2引数)例えば

を最初の引数を取り、指定された関数に渡します引数は関数FUNに渡されます。あなたの例では、parametersが2番目の引数として渡されています(names(parameters)は暗黙的に最初のものです)。

関連する問題