SORU
16 HAZİRAN 2010, ÇARŞAMBA


Nasıl kendi işlevi yazarken'In R kullanmak için üç nokta özelliği?

R dili bağımsız değişken bir dizi alabilir işlevleri tanımlamak için şık bir özelliği vardır. Örneğin, fonksiyonu data.frame bağımsız değişken herhangi bir sayı alır ve her bir bağımsız değişken elde edilen verileri tabloda bir sütun için veri olur. Örnek kullanım:

> 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

İşlevin imzası, bu gibi: üç nokta içerir

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

Benzer bir şey yapan bir fonksiyon yazmak için, birden fazla değer almak ve tek bir dönüş değeri olarak başka bir işlem yapmak ve bunları pekiştirmek istiyorum. Bunu yapmak için, "" işlevi içinde bu işlevin bağımsız değişkenleri .... açmak için nasıl anlamaya ihtiyacım var Bunu yapmak için nasıl bilmiyorum. data.frame işlev tanımında ilgili satırı bir anlam veremem object <- as.list(substitute(list(...)))[-1L].

Nasıl örneğin işlevin imzası üç nokta haline dönüştürmek, bir liste alabilir miyim?

Daha spesifik olmak gerekirse, nasıl aşağıdaki kod get_list_from_ellipsis yazabilirim?

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)

Edit

Bunu yapmak için iki olası yol var gibi görünüyor. as.list(substitute(list(...)))[-1L] list(...). Ancak, bu ikisi aynı şey yapılır. (Farklar, yanıtlara örneklere bakın.) Herkes onları pratik arasındaki fark nedir ve kullanmam gerektiğini söyleyebilir mi?

CEVAP
21 HAZİRAN 2010, PAZARTESİ


Cevapları ve yorumları okudum ve birkaç şey söz olmadığını görüyorum

  1. data.frame list(...) sürümünü kullanır. Kod parçası:

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

    object sütun adları ile bazı büyü yapmak için kullanılır, ama x son data.frame oluşturmak için kullanılır.
    Unevaluated kullanımı için ... değişken match.call kullanıldığı write.csv kod bak.

  2. Dirk açıklama sonucu yazarken cevap listeler bir liste değildir. Uzunlukta bir liste öğeleri language 4 yazın. İlk nesne* - **28 29*ikinci ifade 1:10 ve böyle devam eder. [-1L] gerekli neden: ... sağlanan değişkenler (her zaman bir liste olduğu için) symbol. beklenen kaldırır
    Dirk Birleşik Devletleri substitute döner "". ayrıştırma ağacı unevaluated ifade
    my_ellipsis_function(a=1:10,b=11:20,c=21:30) çağırdığınızda sonra ... "" değişkenler listesi: list(a=1:10,b=11:20,c=21:30) substitute dört öğeleri bir listesini yapın: oluşturur

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

    İlk öğe bir ismi yok ve bu [[1]] Dirk cevap. Bu kullanarak sonuçları elde etmek için:

    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 nesne bir işlev olarak ne kontrol etmek için kullanabiliriz yukarıdaki gibi.

    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 
    

    Tamam. Bakalım substitute sürüm:

       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 
    

    Biz yeri ve zamanı değil. Nesnelerin bu tür (write.csv gibi) ile başa çıkmak için ek hileler gerekir.

Eğer 47 ** kullanmak istiyorsanız, o zaman list(...) Shane cevap olarak kullanmalısınız.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • Major FX

    Major FX

    6 HAZİRAN 2012
  • placeboing

    placeboing

    7 Mart 2006