Düzenleme: sadece çoğaltılmış bağımsız değişkenler için kontrol etmek istiyorsanız
, bunu yapabilirsiniz:
any(duplicated(names(formals(ffoo))))
# [1] TRUE
Hadley aşağıda ikinci yorumunda bahseder gibi, dput()
vermek garanti edilmez Bir fonksiyonun iyi/eksiksiz bir temsilini, yani orijinal cevabımda tarif edilen yaklaşımın (aşağıda yerine) başarısız olduğu fonksiyonlar olabilir.
Orjinal cevap: the C code pointed to by Andrie içinde ima gibi
, bu (değerlendirirken değil) function()
için bir çağrı ayrıştırılırken R gerçekleştirir görünüşte bir çek. Bu nedenle, formals<-
numaralı telefondan aramanızla ilgili kontrolden geçebildiniz ve bu yüzden aşağıdaki (örneğin) kontrol edilmemesinin de sebebi budur. Her iki durumda da, işlev function()
aramasına ayrılmadan değiştirilir/oluşturulur.
eval(call("function", formals(ffoo), body(ffoo)))
# function (x = 7, x, y, a)
# x + 2 * y - 4 * a
R'ın ayrıştırma makineleri genellikle kullanıcı tarafından görülebilen R fonksiyonları açığa çıkmadığı, bu yüzden bu denetimi gerçekleştirmek için hiçbir hazır fonksiyon R fonksiyonu var tahmin ediyorum. Yine de, R ifadesinin, ifadeyi oluşturduğunuzda veya komut satırında bir komut satırında girerek, karakter tanımlamasına karakter tanımlamasını dönüştürerek ve sonra yeniden ayrıştırmayı denediğinizde, aynı denetim kümesini gerçekleştirebilirsiniz. bir fonksiyonu olarak kontrol tamamlamayı için
parse(text = capture.output(dput(ffoo)))
# Error in parse(text = capture.output(dput(ffoo))) :
# repeated formal argument 'x' on line 1
böyle bir şey yapmak:
İşte genel bir fikir Ben bir R fonksiyonu bulamıyor
isParseableFunction <- function(x) {
tryCatch(is.function(x) &
is.expression(parse(text = capture.output(dput(x)))),
error = function(e) FALSE)
}
isParseableFunction(data.frame)
# [1] TRUE
isParseableFunction(mean)
# [1] TRUE
isParseableFunction(ffoo)
# [1] FALSE
isParseableFunction(99)
# [1] FALSE
ancak C okuyabilir [src/main/gram.y] adresindeki kodu (https://github.com/wch/r-source/blob/cf829c12299b8571cd67e9d8aae88ac31450c73c/src/main/gram.y). "CheckFormalArgs()" – Andrie
@RichardScriven No işlevini arayın, yr cevabını kabul ettim. Son çözümüm, “formal” lerdeki gerçek isimleri karşılaştırmak ve maçlardan bir “do.call” oluşturmaktı. Bunu bir "yanıt-uzantısı" olarak göndereceğim –