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
Cevapları ve yorumları okudum ve birkaç şey söz olmadığını görüyorum
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, amax
sondata.frame
oluşturmak için kullanılır.
Unevaluated kullanımı için...
değişkenmatch.call
kullanıldığıwrite.csv
kod bak.Dirk açıklama sonucu yazarken cevap listeler bir liste değildir. Uzunlukta bir liste öğeleri
language
4 yazın. İlk nesne* - **28 29*ikinci ifade1: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 Devletlerisubstitute
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ştururList 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)
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.
Nasıl kendi alanı () alt alan adı ile ...
Bir oluşturmak için Nasıl --- kendi ke...
Nasıl bir WordPress kullanmak bir işle...
Nasıl üye işlevi ile bağlama boost kul...
Nasıl bir JavaScript nesnesinin bir öz...