source

자신의 함수를 작성할 때 R의 생략 부호 기능을 사용하는 방법은 무엇입니까?

nicesource 2023. 6. 8. 19:53
반응형

자신의 함수를 작성할 때 R의 생략 부호 기능을 사용하는 방법은 무엇입니까?

R 언어는 다양한 수의 인수를 사용할 수 있는 함수를 정의하는 기능을 가지고 있습니다.를 들면, 예들어는, 를▁function 입니다.data.frame임의의 수의 인수를 사용하며 각 인수는 결과 데이터 테이블의 열에 대한 데이터가 됩니다.사용 예:

> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))
  letters numbers notes
1       a       1    do
2       b       2    re
3       c       3    mi

함수의 시그니처에는 다음과 같은 생략 부호가 포함됩니다.

function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, 
    stringsAsFactors = default.stringsAsFactors()) 
{
    [FUNCTION DEFINITION HERE]
}

저는 여러 개의 값을 가져와서 하나의 반환 값으로 통합(다른 처리도 수행)하는 기능을 작성하고 싶습니다.이를 위해, 저는 어떻게 그것을 "포장 해제"하는지 알아내야 합니다....함수 내에서 함수의 인수로부터.난 이걸 어떻게 하는지 모른다.다음함정관라인련의의 함수 된 줄data.frame이라object <- as.list(substitute(list(...)))[-1L]이해할 수 없는 일입니다.

그렇다면 함수의 서명에서 생략 부호를 예를 들어 목록으로 변환하려면 어떻게 해야 합니까?

좀 더 구체적으로 말하자면, 어떻게 써야 합니까?get_list_from_ellipsis아래 코드에서?

my_ellipsis_function(...) {
    input_list <- get_list_from_ellipsis(...)
    output_list <- lapply(X=input_list, FUN=do_something_interesting)
    return(output_list)
}

my_ellipsis_function(a=1:10,b=11:20,c=21:30)

편집

이 작업에는 두 가지 방법이 있습니다.그들은 그렇다.as.list(substitute(list(...)))[-1L]그리고.list(...)그러나 이 두 가지는 정확히 동일한 작업을 수행하지 않습니다. (차이점은 답변의 예를 참조하십시오.)그것들 사이의 실질적인 차이점이 무엇인지, 그리고 어떤 것을 사용해야 하는지 알려주실 수 있나요?

답변과 댓글을 읽어보니 언급되지 않은 내용이 거의 없습니다.

  1. data.frame사용하다list(...)코드 코드 조각:

    object <- as.list(substitute(list(...)))[-1L]
    mrn <- is.null(row.names)
    x <- list(...)
    

    object 때 하지만, 열이으마부만리지법을로름,▁is열▁names만지▁with.x하여 최종 를 만듭니다.data.frame.
    은▁of▁▁use에 사용하기 위해....의 논쟁을 .write.csv에서 위치드코▁wherematch.call사용됩니다.

  2. 당신이 댓글로 작성한 결과처럼 더크 답변은 목록이 아닙니다.길이 4의 리스트이며, 다음 요소는language첫는 type입니다. 첫 번째 객체는symbol-list는 두째는현니다입표번ion다니라는 표현입니다.1:10등등.그것이 이유입니다.[-1L] 예상되는 ": " " 를 합니다.symbol에 제공된 로부터....(항상 목록이기 때문에).
    가 말한 것처럼.substitute"평가되지 않은 식을 트리로 지정"을 반환합니다.
    에 전화할 때.my_ellipsis_function(a=1:10,b=11:20,c=21:30)그리고나서...인수로 지정된 "설정"합니다.list(a=1:10,b=11:20,c=21:30)그리고.substitute다음 네 가지 요소의 목록으로 만듭니다.

    List of 4
    $  : symbol list
    $ a: language 1:10
    $ b: language 11:20
    $ c: language 21:30
    

    번째 은 첫번째요이없름으다며같음습다니과이는소에입니다.[[1]]더크 대답으로.다음을 사용하여 이 결과를 달성합니다.

    my_ellipsis_function <- function(...) {
      input_list <- as.list(substitute(list(...)))
      str(input_list)
      NULL
    }
    my_ellipsis_function(a=1:10,b=11:20,c=21:30)
    
  3. 위와 같이 우리는 사용할 수 있습니다.str함수에 어떤 개체가 있는지 확인합니다.

    my_ellipsis_function <- function(...) {
        input_list <- list(...)
        output_list <- lapply(X=input_list, function(x) {str(x);summary(x)})
        return(output_list)
    }
    my_ellipsis_function(a=1:10,b=11:20,c=21:30)
     int [1:10] 1 2 3 4 5 6 7 8 9 10
     int [1:10] 11 12 13 14 15 16 17 18 19 20
     int [1:10] 21 22 23 24 25 26 27 28 29 30
    $a
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
       1.00    3.25    5.50    5.50    7.75   10.00 
    $b
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
       11.0    13.2    15.5    15.5    17.8    20.0 
    $c
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
       21.0    23.2    25.5    25.5    27.8    30.0 
    

    괜찮아요.어디 보자꾸나substitute버전:

       my_ellipsis_function <- function(...) {
           input_list <- as.list(substitute(list(...)))
           output_list <- lapply(X=input_list, function(x) {str(x);summary(x)})
           return(output_list)
       }
       my_ellipsis_function(a=1:10,b=11:20,c=21:30)
        symbol list
        language 1:10
        language 11:20
        language 21:30
       [[1]]
       Length  Class   Mode 
            1   name   name 
       $a
       Length  Class   Mode 
            3   call   call 
       $b
       Length  Class   Mode 
            3   call   call 
       $c
       Length  Class   Mode 
            3   call   call 
    

    그건 우리가 필요로 했던 게 아니었어요.이러한 종류의 개체를 처리하려면 추가적인 트릭이 필요합니다(예:write.csv).

사용할 경우...그럼 셰인 답변처럼 사용해야 합니다.list(...).

다음을 사용하여 생략 부호를 목록으로 변환할 수 있습니다.list()작업을 수행합니다.

> test.func <- function(...) { lapply(list(...), class) }
> test.func(a="b", b=1)
$a
[1] "character"

$b
[1] "numeric"

그래서 너의get_list_from_ellipsis▁more▁is에 지나지 않습니다.list.

알 수 예:c()또는data.frame()) 를 사용하는 것은 좋은 생각이 아닙니다....그러나 각 매개 변수를 미리 알고 있으면 인수 문자열에 모호성과 복잡성이 추가됩니다(다른 사용자에게는 함수 서명이 명확하지 않음).인수 목록은 함수 사용자에게 중요한 문서입니다.

그렇지 않으면 사용자의 함수 인수에 매개 변수를 모두 표시하지 않고 매개 변수를 하위 함수로 전달하려는 경우에도 유용합니다.이는 기능 설명서에서 확인할 수 있습니다.

Shane과 Dirk의 반응에 덧붙이자면: 비교하는 것은 흥미롭습니다.

get_list_from_ellipsis1 <- function(...)
{
  list(...)
}
get_list_from_ellipsis1(a = 1:10, b = 2:20) # returns a list of integer vectors

$a
 [1]  1  2  3  4  5  6  7  8  9 10

$b
 [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

와 함께

get_list_from_ellipsis2 <- function(...)
{
  as.list(substitute(list(...)))[-1L]
}
get_list_from_ellipsis2(a = 1:10, b = 2:20) # returns a list of calls

$a
1:10

$b
2:20

상태로는, 것처럼 .my_ellipsis_function첫 번째가 분명히 더 간단하지만요.

당신은 이미 절반의 대답을 했습니다.고려하다

R> my_ellipsis_function <- function(...) {
+   input_list <- as.list(substitute(list(...)))
+ }
R> print(my_ellipsis_function(a=1:10, b=2:20))
[[1]]
list

$a
1:10

$b
11:20

R> 

그래서 이것은 두 가지 주장이 필요했습니다.a그리고.b목록으로 변환했습니다.그게 당신이 부탁한 거 아니었나요?

이것은 예상대로 작동합니다.다음은 대화형 세션입니다.

> talk <- function(func, msg, ...){
+     func(msg, ...);
+ }
> talk(cat, c("this", "is", "a","message."), sep=":")
this:is:a:message.
> 

기본 인수를 제외하고 동일합니다.

> talk <- function(func, msg=c("Hello","World!"), ...){
+     func(msg, ...);
+ }
> talk(cat,sep=":")
Hello:World!
> talk(cat,sep=",", fill=1)
Hello,
World!
>

보시다시피, 기본값이 특정한 경우에 원하는 것이 아닌 경우 함수 내의 함수에 '추가' 인수를 전달하는 데 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/3057341/how-to-use-rs-ellipsis-feature-when-writing-your-own-function

반응형