Deparse এর দ্রুত বিকল্প ()


9

আমি এমন একটি প্যাকেজ বজায় রাখি যা বার বার কল করার উপর নির্ভর করে deparse(control = c("keepNA", "keepInteger"))controlসর্বদা একই থাকে এবং প্রকাশটি বিভিন্ন রকম হয়। deparse()বার বার একই বিকল্পগুলির সাথে একই বিকল্পগুলির ব্যাখ্যা করার জন্য অনেক সময় ব্যয় করে .deparseOpts()

microbenchmark::microbenchmark(
    a = deparse(identity, control = c("keepNA", "keepInteger")),
    b = .deparseOpts(c("keepNA", "keepInteger"))
)
# Unit: microseconds
# expr min  lq  mean median  uq  max neval
#    a 7.2 7.4 8.020    7.5 7.6 55.1   100
#    b 3.0 3.2 3.387    3.4 3.5  6.0   100

কিছু সিস্টেমে রিডানড্যান্ট .deparseOpts()কলগুলি বেশিরভাগ রানটাইমের বেশিরভাগ সময় নেয় deparse()( এখানে শিখা গ্রাফ )।

আমি সত্যিই কেবল .deparseOpts()একবার কল করতে এবং তারপরে সংখ্যার কোডটি সরবরাহ করতে চাই deparse(), তবে .Internal()সি কোডটি সরাসরি কল করা বা আহ্বান করা ছাড়া এটি অসম্ভব বলে মনে হয়, যার কোনটিই প্যাকেজ বিকাশের দিক থেকে অনুকূল নয়।

deparse
# function (expr, width.cutoff = 60L, backtick = mode(expr) %in% 
#     c("call", "expression", "(", "function"), 
#     control = c("keepNA", "keepInteger", "niceNames", 
#         "showAttributes"), nlines = -1L) 
# .Internal(deparse(expr, width.cutoff, backtick, .deparseOpts(control), 
#     nlines))
# <bytecode: 0x0000000006ac27b8>
# <environment: namespace:base>

কোন সুবিধাজনক কাজ আছে?

উত্তর:


4

1) এমন একটি ফাংশন সংজ্ঞায়িত করুন যা ডিপার্সির অনুলিপি তৈরি করে যার পরিবেশটি .darseOpts এর পরিবর্তিত সংস্করণটি সনাক্ত করার জন্য পুনরায় সেট করা হয়েছে যা সনাক্তকরণ ফাংশনের সমান হয়ে গেছে। ইন Runআমরা তারপর যে ফাংশন একটি তৈরি করতে চালানো deparse2এবং যে চালানো। এটি .Internalসরাসরি চালানো এড়ানো হয়।

make_deparse <- function() {
  .deparseOpts <- identity
  environment(deparse) <- environment()
  deparse
}

Run <- function() {
  deparse2 <- make_deparse()
  deparse2(identity, control = 65)
}

# test
Run()

২) এটি করার আরেকটি উপায় হ'ল একটি কনস্ট্রাক্টর ফাংশন সংজ্ঞায়িত করা যা একটি পরিবেশ তৈরি করে যাতে একটি পরিবর্তিত অনুলিপি তৈরি করা যায় deparseএবং সেই অনুলিপিটি .deparseOptsপরিচয় ফাংশন হিসাবে পুনরায় সংজ্ঞায়িত করতে একটি ট্রেস যুক্ত করা যায় । তারপরে সেই পরিবেশটি ফিরিয়ে দিন। আমাদের তখন কিছু ফাংশন রয়েছে যা এটি ব্যবহার করে এবং এই উদাহরণস্বরূপ আমরা Runএটি প্রদর্শন করতে একটি ফাংশন তৈরি করি এবং তারপরে কেবল সম্পাদন করি Run। এটি ব্যবহার করা এড়ানো হয়.Internal

make_deparse_env <- function() {
  e <- environment()
  deparse <- deparse
  suppressMessages(
    trace("deparse", quote(.deparseOpts <- identity), print = FALSE, where = e)
  )
  e
}

Run <- function() {
  e <- make_deparse_env()
  e$deparse(identity, control = 65)
}

# test
Run()

3) তৃতীয় পদ্ধতির deparseএকটি নতুন যুক্তি যুক্ত করে পুনরায় সংজ্ঞা দেওয়া যা .deparseOptsএকটি ডিফল্ট থাকতে identityসেট করে controlএবং 65 এর ডিফল্ট থাকতে সেট করে ।

make_deparse65 <- function() {
  deparse2 <- function (expr, width.cutoff = 60L, backtick = mode(expr) %in% 
    c("call", "expression", "(", "function"), 
    control = 65, nlines = -1L, .deparseOpts = identity) {}
  body(deparse2) <- body(deparse)
  deparse2
}

Run <- function() {
  deparse65 <- make_deparse65()
  deparse65(identity)
}

# test
Run()

বাহ, এতো চালাক !!! আমি যে চিন্তা করতে হবে না! সত্যিই আমার সমস্ত সিস্টেমে এটি মানদণ্ডের প্রত্যাশায়!
ল্যান্ডাউ

আমি যখন (1) প্রয়োগ করি এবং backtickযুক্তিটি সংক্ষেপিত করি তখন 6x দ্রুত ছাড়াই হয়! আমি সেই সাথে যাচ্ছি। কাজের জন্য অনেক ধন্যবাদ!
ল্যান্ডউ 13

হুম ..., দৃশ্যত, (1) দ্বারা উত্পাদিত ফাংশনগুলিতে কলটি R CMD checkসনাক্ত করে .Internal()। চারপাশে কাজ করা খুব সহজ, আমার কেবল দরকার make_deparse()(expr, control = 64, backtick = TRUE)। যতবার আমি এটি ব্যবহার করি ততবারে ডিপার্সারটিকে পুনর্গঠন করা নির্বাক, তবে এটি আমি আগে যে নির্বিকার ব্যবহার deparse()করছিলাম তার চেয়ে অনেক দ্রুত ।
ল্যান্ডউ

আমার জন্য না. আমি শুধু সঙ্গে একটি প্যাকেজ তৈরি চেষ্টা make_deparseএবং Runফাংশন (1) এবং দৌড়ে R CMD buildএবং R CMD check --as-cranঅধীনে "R version 3.6.1 Patched (2019-11-18 r77437)"এবং এটি অভিযোগ করেনি এবং আমি কোন সমাধান নীচে উপস্থিত প্রয়োজন ছিল না। আপনি কি নিশ্চিত যে আপনি কিছু আলাদা করছেন না বা অতিরিক্ত কারণেই এটি ঘটছে?
জি। গ্রোথেনডিক

1
এটা তোলে আপনার কোড শীর্ষ স্তরে এটা সংজ্ঞায়িত দ্বারা সৃষ্ট হয়েছিল: direct_deparse <- make_direct_deparse()। উত্তরে প্রদর্শিত কোডটি সেটিকে না করায় সতর্ক ছিল এবং কেবল এটি কোনও ফাংশনের মধ্যে অর্থাৎ এর মধ্যেই সংজ্ঞায়িত হয়েছিল Run
জি গ্রোথেনডিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.