SORU
21 EYLÜL 2012, Cuma


...() Kafası karışık?

another question, sapply(substitute(...()), as.character) isimler işleve elde etmek için bir işlev içinde kullanılmıştır. as.character kısmı kulağa hoş geliyor, ama ne ...() yapar mı?

substitute dışında geçerli bir kod değil

> test <- function(...) ...()
> test(T,F)
Error in test(T, F) : could not find function "..."

Daha fazla test bazı durumlarda:

> test <- function(...) substitute(...())
> test(T,F)
[[1]]
T

[[2]]
F

> test <- function(...) substitute(...)
> test(T,F)
T

CEVAP
22 EYLÜL 2012, CUMARTESİ


İşte ...() Bu şekilde çalışır neden bir kroki. Daha ayrıntılı bilgi ve başvurular daha sonra anlatırım, ama önemli noktaları bu dokunur.

  1. Bileşenlerinden herhangi bir değiştirme yapmadan önce, substitute() ilk R deyimi ayrıştırır.

  2. ...() ... ad bir nesneye ayrıştırır, oysa bir arama nesnesi için ayrıştırır.

  3. ... özel bir nesne, yalnızca işlev çağrıları kullanılmak üzere tasarlanmıştır. Sonuç olarak, ikame uygulayan bir C kodu özel önlemler çağrısı bir nesne bulunduğunda ... ele alır. Benzer önlemlerdeğil... bir sembol olarak ortaya çıktığında çekilmiş. (İlgili kod fonksiyonları do_substitute, substitute * * * R_SRCDIR/src/main/coerce.c. substituteList (özellikle son ikisi))

Yani, rolü () ...() neden ifadeye incelenemeyecek kadar bir ara (aka dili) nesne, böylece ikame döndürecektir tam olarak genişletilmiş değer noktalar. Görünse de şaşırtıcı ... alır yedek için bile zaman dışarıda olan () ancak: (a) aramaları saklı DAHİLİ olarak listesi gibi nesneler ve (b) ilgili C kodu gibi görünüyor arasında bir ayrım yapmak ilk eleman listesini ve sonraki olanlar.


Sadece bir yan not: substitute incelenmesi davranış ya da çeşitli nesnelerin sınıfları, yararlı, böyle küçük bir kum kurmak buluyorum

f <- function(...) browser()
f(a = 4, 77, B = "char")
## Then play around within the browser
class(quote(...))  ## quote() parses without substituting
class(quote(...()))
substitute({...})
substitute(...(..., X, ...))
substitute(2 <- (makes * list(no - sense))(...))

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrea Lewis

    Andrea Lewis

    14 Mart 2013
  • spyib

    spyib

    9 Ocak 2007
  • thepoke64738

    thepoke64738

    17 HAZİRAN 2011