簡體   English   中英

R:使用可選參數編​​寫函數

[英]R: write function with optional arguments

我正在嘗試編寫一個構建API請求的函數。 困難:我想在函數內部使用最佳參數,並根據這些可選參數的存在來構建API請求。 例:

space <- "earth"
start_date <- "2018-10"
end_date <- "2018-11"
optionalArgument1 <- "America"
optionalArgument2 <- "people"
optionalArgument3 <- "size"
optionalArgument4 <- "ocean"

myfunction <- function(space, start_date, end_date, optionalArgument1, optionalArgument2, optionalArgument3, optionalArgument4){

              api_request <- paste0("https://myapi.com/getData?hello",

                    #NEEDED
                    "&space={s:'", space,"'}",
                    "&period={M:{start:'",start_date,"',end:'",end_date,"'}}",

                    #OPTIONAL
                    "&filter={",
                        "SMALL_filter1:{$sf1:'",optionalArgument1,"'},",
                        "SMALL_filter2:{$sf2:'",optionalArgument2,"'},",
                        "SMALL_filter3:{$sf3:'",optionalArgument3,"'}",
                    "}",

                    "&segment=",optionalArgument4

              )

              return(api_request)    
}

我的目標是允許函數傳遞api_request,無論用戶提供1、2、3還是4個可選參數。

舉個例子:

myfunction(space, start_date, end_date, optionalArgument1, optionalArgument4)

應該返回如下內容:

[1] https://myapi.com/getData?hello&space={s:'earth'}&period={M:{start:'2018-10'end:'2018-11'}}&filter={SMALL_filter1:{$sf1:'America'}}&segment="ocean

另一個例子:

myfunction(space, start_date, end_date, optionalArgument4)

應該返回:

[1] https://myapi.com/getData?hello&space={s:'earth'}&period={M:{start:'2018-10'end:'2018-11'}}&segment="ocean

我被困住了...您對此有任何管理方法嗎? 謝謝你的幫助

首先,您錯過了“&date_start =”之后的逗號。 然后,我想您可以檢查該函數接收了多少個可選選項,然后將它們全部與過濾器字符串一起粘貼。 為此,必須將NULL作為可選參數的默認值。

argument1 <- "2018-11"
argument2 <- "2018-12"
optionalArgument1 <- "my_first_filter"
optionalArgument2 <- "my_second_filter"
optionalArgument3 <- "my_third_filter"

myfunction <- function (argument1, argument2, optionalArgument1 = NULL, optionalArgument2 = NULL, optionalArgument3 =NULL) {

  optional_options = c(optionalArgument1,optionalArgument2,optionalArgument3)
  optional_request = paste0("&filter=",optional_options,collapse = "")
  api_request <- paste0("myapiurl.com/getData?",
                        "&date_start=",argument1,
                        "&date_end=",argument2,optional_request)

  return(api_request)    
}
myfunction(argument1,argument2, optionalArgument1,optionalArgument2)

這段代碼僅使用兩個可選參數,輸出如下:

> myfunction(argument1,argument2, optionalArgument1,optionalArgument2)
[1] "myapiurl.com/getData?&date_start=2018-11&date_end=2018-12&filter=my_first_filter&filter=my_second_filter"

我希望這有幫助。

更新:在您的新請求之后,我已經編寫了此代碼,但是如果您想使用我之前所說的內容,我認為您應該可以做到這一點。

space <- "earth"
start_date <- "2018-10"
end_date <- "2018-11"
optionalArgument1 <- "America"
optionalArgument2 <- "people"
optionalArgument3 <- "size"
optionalArgument4 <- "ocean"

myfunction <- function(space, start_date, end_date, optionalArgument1=NULL, optionalArgument2=NULL, optionalArgument3=NULL, optionalArgument4=NULL){

  optional_options = c(optionalArgument1,optionalArgument2,optionalArgument3)
  optional_request=NULL
  if(length(optional_options>0)){
    optional_request = paste("&filter=",paste0("{SMALL_filter1:{$sf1:'",optional_options,"}",collapse = ""),collapse = "",sep = "")
  }
  if(!is.null(optionalArgument4)){
    optional_request = paste(optional_request,"&filter={",optionalArgument4,"}",sep="",collapse = "")
  }

  api_request <- paste0("https://myapi.com/getData?hello",

                        #NEEDED
                        "&space={s:'", space,"'}",
                        "&period={M:{start:'",start_date,"',end:'",end_date,"'}}",optional_request)


  return(api_request)    
}

和輸出:

> myfunction(space, start_date, end_date, optionalArgument1, optionalArgument4=optionalArgument4)
[1] "https://myapi.com/getData?hello&space={s:'earth'}&period={M:{start:'2018-10',end:'2018-11'}}&filter={SMALL_filter1:{$sf1:'America}&filter={ocean}"
> myfunction(space, start_date, end_date, optionalArgument4=optionalArgument4)
[1] "https://myapi.com/getData?hello&space={s:'earth'}&period={M:{start:'2018-10',end:'2018-11'}}&filter={ocean}"

請注意,您必須命名參數4,因為必須將其單獨對待,因此不能按參數順序使用。

你可以做:

myfunction <- function(space, start_date, end_date, ..., optionalArgument4 = NULL){

  args <- c(...)

  filters <- paste(unlist(lapply(seq_along(args),
                           function(i) sprintf("SMALL_filter%s:{$sf%s:'%s'}",
                                                              i, i, args[i]))),
                   collapse = ",")

  api_request <- paste0("https://myapi.com/getData?hello",

                        #NEEDED
                        "&space={s:'", space,"'}",
                        "&period={M:{start:'",start_date,"',end:'",end_date,"'}}",

                        #OPTIONAL
                        ifelse(filters=="","",sprintf("&filter={%s}",filters)),

                        ifelse(!is.null(optionalArgument4),
                               paste0("&segment=",optionalArgument4),"")

  )

  return(api_request)    
}

調用函數時,必須命名為optionalArgument4

space <- "earth"
start_date <- "2018-10"
end_date <- "2018-11"
optionalArgument1 <- "America"
optionalArgument2 <- "people"
optionalArgument3 <- "size"
optionalArgument4 <- "ocean"

myfunction(space, start_date, end_date, optionalArgument1, optionalArgument4 = optionalArgument4)
# [1] "https://myapi.com/getData?hello&space={s:'earth'}&period={M:{start:'2018-10',end:'2018-11'}}&filter={SMALL_filter1:{$sf1:'America'}}&segment=ocean"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM