R: kendi yazdığı pakette magrittr boru operatörünü kullanın


101

Veri dönüşümlerini zincirlemek için kendi yazdığım bir pakette pakete %>%tanıtılan boru operatörünü kullanmak magrittristiyorum dplyr. magrittrolarak listelenir Importiçinde DESCRIPTIONdosyanın. Kendi paketimi yükledikten ve boru operatörünü kullanan işlevi test ettikten sonra aşağıdaki hata mesajını alıyorum:

İşlev adında hata (parametre,: "%>%" işlevi bulunamıyor

Değişen %>%için magrittr::%>%paket artık inşa edilemez çünkü fonksiyon kaynak kodunda ya yardımcı olmuyor.


4
Bir paketin içindeki bir işlevin içindeki boru operatörüne karşı tavsiyede bulunurum. Hata ayıklamayı çok daha zor hale getirir (çağrı yığını boru ile delicesine derinleşir). Paketler için geçici bir değişkenin üzerine yazardım, bu da testi çok daha kolay hale getirir (düşünün: R size hatanın hangi satırda oluştuğunu söyler). Boru etkileşimli kullanım için iyidir, ancak programlama için bir yük olabilir.

Yanıtlar:


102

magrittrListelenmiş olsaydınız doğru şekilde çalışmış olmalıydı Depends. Ancak bu tavsiye edilmez . Bunun yerine, bırakın magrittriçinde Importsve aşağıdaki satırı ekleyin NAMESPACE:

importFrom(magrittr,"%>%")

R uzantılarını yazmanızı öneririm . Sorunuz paragraf 1.1.3 ve 1.5.1'de ele alınmaktadır.


1
@alexanderketh Bu durumda, yanıtın yanındaki yeşil onay işaretine basarak yanıtın kabul edildiğini işaretlemelisiniz. SO'ya hoş geldiniz!
tonytonov

54
Kullanıyorsanız , NAMESPACE'in sırasında otomatik olarak doldurulmasını roxygen2ekleyebilirsiniz . #' importFrom magrittr "%>%"roxygenize()
Roman Luštrik

38
@ RomanLuštrik, @ eksik olmalı#' @importFrom magrittr "%>%"
Roah

13
Bunun yalnızca %>%paketinizde dahili olarak kullanmanıza izin vereceğini unutmayın. API'niz, kullanıcıların kullanarak işlevleri zincirlemesini gerektiriyorsa %>%, yine de açıkça yüklemeleri gerekir magrittr. Bu sorunu çözmenin bir yolu, işlevi yeniden dışa aktarmaktır. İşte bunun nasıl yapılacağına dair bir örnek .
Ramnath


33

Artık paketlerinizde boruyu desteklemenin daha kolay bir yolu var. Harika paketin usethisişlevi vardır use_pipe(). Bu işlevi bir kez çalıştırırsınız ve her şeyi halleder. Bu nasıl use_pipe()işlev açıklanan usethisbelgelere:

Magrittr'in borusunu paketinizde dahili olarak kullanmak ve paketinizin kullanıcıları için yeniden dışa aktarmak için kurulum gerekli mi:

DESCRIPTION içindeki "İçe Aktarmalar" a magrittr ekler

Gerekli roxygen şablonuyla R / utils-pipe.R oluşturur


Satırı use_pipe(), paketi oluşturmak için kullandığınız koda ekliyor musunuz ? Örneğin, ben çalıştırın: usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path). Sadece use_pipe()başında ekler miyim ?
Josh

1
@Josh usethis, paketi geliştirirken işlevleri bir kez kullanırsınız. Bu işlevler daha sonra gerekli parçaları yapım talimatlarına ve diğer her şeye ekler.
Andrew Brēza

32

Ek bir çözüm - roxygenpaketi kullanın . devtoolsPaketin bir parçası olarak uygulanmaktadır . devtoolsYüklendikten sonra arama devtools::document(),NAMESPACE için . Ayrıca, kullanışlı olan belgelerle .Rd dosyalarını otomatik olarak oluşturur.

Tek yapmanız gereken, #' @import packagenameo paketten tüm işlevleri içe aktarmak için bir dosyaya formatta özel bir yorum eklemek veya#' @importFrom packagename functionname içe aktarmak bir işlevi içe . Dosyalarınızda bu yorumlardan istediğiniz kadar çok olabilir, böylece her dosyanın üstünde veya harici bir işleve ihtiyaç duyan işlevlerinizin her birinde bir grup yorum bulundurabilirsiniz.

Ardından çalıştırırsınız devtools::document()ve bu yorumları aramak için kodunuzu ayrıştırır ve ardından sizin için uygun bir NAMESPACEdosya oluşturur . Kolay.


1
Bunu yaptığımda, R betiğindeki ilk işlev için yardım dosyasına ilişkin aşağıdaki oksijen yorumlarını karıştırıyor. Global oksijen yorumlarını yardım dosyasından nasıl ayırırım?
jzadra

2
Genellikle içe aktarma yorumlarını her işlev için ayrı ayrı koyarım. Bu şekilde, dosyadaki diğer işlevler değişirse, içe aktarmalarınız doğru kalır. Öyleyse küresel tanım yok.
Mike Stanley

18

RStudio, Hadley'in devtoolspaketini kullandığınızı magrittrve DESCRIPTIONdosyanın İçe Aktarmalar bölümünde listelendiğinizi varsayarsak, %>%paket işlevlerimde çalışmak için attığım adımlar burada verilmiştir .

İlk olarak, işlevi yazın foo.R:

#' Convert \code{data.frame} to \code{list}.
#' 
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
#' @param x A \code{data.frame} object.
#' @examples
#' my_result <- foo(iris)
#'
foo <- function(x) {
    x %>%
        as.list()
}

İkincisi, koş devtools::document() .

Üçüncü olarak, koş devtools::load_all().

Gibi bir dosya bu sizin oluşturulacak R/dizin ve beklendiği gibi işlev çalışmalıdır.


7
@name %>%buranın amacı nedir?
JelenaČuklina
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.