আর: স্ব লিখিত প্যাকেজে ম্যাজিট্রিক পাইপ অপারেটর ব্যবহার করুন


104

আমি প্যাকেজে প্যাকেজের সাথে %>%পরিচিত পাইপ-অপারেটরটি magrittrএকটি প্যাকেজে ব্যবহার করতে চাই যা আমি নিজেকে চেইন dplyrডেটা ট্রান্সফরমেশনগুলিতে লিখেছিলাম । ফাইল magrittrহিসাবে তালিকাভুক্ত করা Importহয় DESCRIPTION। আমার নিজের প্যাকেজটি লোড করার পরে এবং পাইপ-অপারেটর ব্যবহার করে এমন ফাংশনটি পরীক্ষা করার পরে আমি নিম্নলিখিত ত্রুটি বার্তাটি পেয়েছি:

ফাংশনামে ত্রুটি (পরামিতি: "%>%" ফাংশনটি খুঁজে পাওয়া যায়নি

ফাংশন উত্স কোডে পরিবর্তন %>%করা কোনওভাবেই magrittr::%>%সহায়তা করে না কারণ প্যাকেজটি আর তৈরি করা যায় না।


6
আমি প্যাকেজের ভিতরে কোনও ফাংশনের ভিতরে পাইপ অপারেটরের বিরুদ্ধে পরামর্শ দেব। এটি ডিবাগিংকে আরও শক্ত করে তোলে (কল স্ট্যাকটি পাইপের সাথে অত্যন্ত গভীর হয়ে যায়)। প্যাকেজগুলির জন্য আমি কেবলমাত্র একটি অস্থায়ী ভেরিয়েবলটি ওভাররাইট করেছিলাম যা পরীক্ষাকে অনেক সহজ করে তোলে (মনে করুন: ত্রুটিটি কোন লাইনে ঘটেছে তা আপনাকে বলছি)। পাইপ ইন্টারেক্টিভ ব্যবহারের জন্য ঠিক আছে তবে প্রোগ্রামিংয়ের জন্য এটি বোঝা হতে পারে।

উত্তর:


104

আপনি যদি magrittrতালিকাভুক্ত করে থাকেন তবে এটি সঠিকভাবে কাজ করা উচিত ছিল Depends। যাইহোক, এটি পরামর্শ দেওয়া হয় না । পরিবর্তে, আপনি ছেড়ে magrittrযান Importsএবং নিম্নলিখিত লাইনটি এতে যুক্ত করুন NAMESPACE:

importFrom(magrittr,"%>%")

আমি রাইটিং আর এক্সটেনশনগুলি পড়ার পরামর্শ দিচ্ছি । আপনার প্রশ্নটি অনুচ্ছেদগুলিতে 1.1.3 এবং 1.5.1.1 এ আচ্ছাদিত।


4
@alexenderketh সেক্ষেত্রে আপনি গ্রহণযোগ্য হিসাবে চিহ্নিত করার জন্য উত্তরের পাশে সবুজ টিক চিহ্নটি চাপুন। তাই আপনাকে স্বাগতম!
টনিটোভ

55
আপনি যদি ব্যবহার করছেন roxygen2তবে #' importFrom magrittr "%>%"আপনি NAMESPACE এর সময় স্বয়ংক্রিয়ভাবে পপুলেশন যুক্ত করতে পারেন roxygenize()
রোমান Luštrik

38
@ রোমানলুয়েট্রিক, কেবল নিখোঁজ @, হওয়া উচিত#' @importFrom magrittr "%>%"
রোহ

13
নোট করুন যে এটি আপনাকে কেবল %>%আপনার প্যাকেজে অভ্যন্তরীণভাবে ব্যবহারের অনুমতি দেবে । যদি আপনার এপিআই ব্যবহার করে ব্যবহারকারীদের চেইন ফাংশনগুলির প্রয়োজন হয় %>%, তাদের এখনও স্পষ্টভাবে লোড করতে হবে magrittr। এই সমস্যাটি সমাধান করার একটি উপায় হ'ল ফাংশনটি পুনরায় এক্সপোর্ট করা। এটি কীভাবে করা যায় তার একটি উদাহরণ এখানে ।
রামনাথ


34

একটি অতিরিক্ত সমাধান - roxygenপ্যাকেজটি ব্যবহার করুন । এটি devtoolsপ্যাকেজের অংশ হিসাবে প্রয়োগ করা হয়েছে । একবার devtoolsইনস্টল হয়ে গেলে , কলিং devtools::document()আপনার NAMESPACEজন্য আপডেট করে । এটি ডকুমেন্টেশন সহ অটো তৈরি করে .আরডি ফাইলগুলিও কার্যকর।

আপনি যা করেন তা হ'ল #' @import packagenameসেই প্যাকেজ থেকে সমস্ত ফাংশন #' @importFrom packagename functionnameআমদানি করতে বা কোনও ফাংশন আমদানি করার জন্য কোনও ফর্ম্যাটে একটি বিশেষ মন্তব্য যুক্ত করা । আপনার ফাইলগুলিতে আপনি যতগুলি চান এই মন্তব্যগুলি আপনার কাছে থাকতে পারে, যাতে আপনার প্রতিটি ফাইলের শীর্ষে বা একটি বাহ্যিক ফাংশন প্রয়োজন এমন প্রতিটি ফাংশন সহ সেগুলির একটি সেট রাখতে পারেন।

তারপরে আপনি দৌড়ে যান devtools::document()এবং এটি সেই মন্তব্যগুলির জন্য অনুসন্ধান করে আপনার কোডটিকে বিশ্লেষণ করে এবং তারপরে এটি NAMESPACEআপনার জন্য একটি উপযুক্ত ফাইল তৈরি করে । সহজ।


4
যখন আমি এটি করি, এটি নীচের অক্সিজেন মন্তব্যগুলিকে মিস করে যা আর স্ক্রিপ্টের প্রথম ফাংশনের জন্য সহায়তা ফাইলের সাথে সম্পর্কিত। আমি কীভাবে সহায়তা ফাইলের থেকে বিশ্বব্যাপী অক্সিজেন মন্তব্যগুলি পৃথক করব?
জাজাদ্রা

4
আমি সাধারণত প্রতিটি ফাংশন দিয়ে আমদানি মন্তব্যগুলি পৃথকভাবে রাখি। যদি ফাইলের অন্য ফাংশনগুলি পরিবর্তন হয় তবে আপনার আমদানিগুলি সঠিক থাকে। সুতরাং তখন কোনও বিশ্বব্যাপী সংজ্ঞা নেই।
মাইক স্ট্যানলি 21

33

আপনার প্যাকেজগুলিতে পাইপ সমর্থন করার এখন আরও সহজ উপায়। দুর্দান্ত প্যাকেজের usethisফাংশন রয়েছে use_pipe()। আপনি একবার সেই ফাংশনটি চালান এবং এটি সবকিছু পরিচালনা করে। এই হল কিভাবে use_pipe()ফাংশন বর্ণনা করা হয় usethisডকুমেন্টেশন:

আপনার প্যাকেজটিতে অভ্যন্তরীণভাবে ম্যাজিট্রেটরের পাইপ ব্যবহার করার জন্য এবং এটি আপনার প্যাকেজের ব্যবহারকারীদের জন্য পুনরায় রফতানি করার জন্য কি সেটআপটি প্রয়োজনীয়:

বর্ণনায় "আমদানি" তে ম্যাজিট্রিট যুক্ত করে

প্রয়োজনীয় রক্সিজেন টেম্পলেটটি দিয়ে আর / ইউজেস-পাইপ.আর তৈরি করে


আপনি use_pipe()প্যাকেজটি তৈরি করতে যে কোডটি ব্যবহার করছেন তাতে কি লাইন যুক্ত করবেন ? উদাহরণস্বরূপ, আমি সঞ্চালন করুন: 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)। আমি কি use_pipe()শুরুতে যুক্ত করব?
জোশ

4
আপনি usethisযখন প্যাকেজটি বিকাশ করছেন তখন আপনি জোশের কাজগুলি একবার ব্যবহার করেন । এই ফাংশনগুলি তারপরে বিল্ড নির্দেশিকাগুলি এবং সমস্ত কিছুতে প্রয়োজনীয় অংশগুলি যুক্ত করে।
অ্যান্ড্রু ব্রাজা

18

ধরে নিই যে আপনি আর স্টুডিও, হ্যাডলির devtoolsপ্যাকেজটি ব্যবহার করছেন এবং ফাইলটির magrittrআমদানি বিভাগে তালিকাভুক্ত DESCRIPTION, %>%আমার প্যাকেজ ফাংশন (গুলি) তে কাজ করার জন্য আমি যে পদক্ষেপ নিয়েছি তা এখানে ।

প্রথমে ফাংশন লিখুন 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()
}

দ্বিতীয়, চালান devtools::document()

তৃতীয়, চালান devtools::load_all()

মত একটি ফাইল এই আপনার তৈরি করা হবে R/ডিরেক্টরি ও আপনার ফাংশন আশানুরূপ কাজ করা উচিত নয়।


7
এখানকার উদ্দেশ্য কী @name %>%?
জেলেনাউকলিনা ২ina
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.