আর তে "নিক্ষেপ" সমান


140

কীভাবে একজন আর-তে একটি ত্রুটি "নিক্ষেপ" করে? আমার একটি ফাংশন রয়েছে যা একটি ডেটা ফ্রেম এবং কিছু কলামের নাম নেয় এবং তাদের সাথে স্টাফ করে। যদি কলামগুলি বিদ্যমান না থাকে তবে আমি চাই যে ফাংশনটি বন্ধ হয়ে যায় এবং তার উপর নির্ভর করে সমস্ত ফাংশন বন্ধ করে দেওয়া হয়।

আমি দেখেছি recoverএবং browseএবং traceback, ভাল, তারা কাছে বলে মনে হচ্ছে তবে আমি যা খুঁজছি তা নয়।


2
ডান, পুনরুদ্ধার, ব্রাউজার এবং ট্রেসব্যাক ডিবাগিংয়ের জন্য, অন্যদিকে ট্রাই / ক্যাচ সিস্টেমগুলি উত্পাদন কোডে ত্রুটিগুলি পরিচালনা করার জন্য।
হারলান

20
প্রশ্নটি জিজ্ঞাসাবাদীরা একটি প্রশ্নে একাধিকবার সন্ধান করছে এমন ফাংশনটির নাম ব্যবহার করলে আমি এটি পছন্দ করি;)
হ্যাডলি

আমি মনে করি একটি কারণ আছে যে এই প্রশ্নের শীর্ষ উত্তরের চেয়ে বেশি আপোড রয়েছে। যদিও এই অন্যান্য প্রশ্নটি প্রযুক্তিগতভাবে অফ-টপিকের, এটি স্ট্যাক ওভারফ্লো যে জন্য অপরিচিত একটি অপরিচিত বিষয়ের পুরোপুরি আঁটসাঁট সংক্ষিপ্তসার।
জোশিয়ার যোদার

উত্তর:


113

দেখুন help(tryCatch):

শর্তগুলি ' signalCondition' দ্বারা সংকেতযুক্ত । তদ্ব্যতীত,
' stop' এবং ' warning' ফাংশনগুলি
শর্ত যুক্তিগুলি গ্রহণ করতেও পরিবর্তন করা হয়েছে ।

এবং পরে 'আরও দেখুন' এর অধীনে:

' stop' এবং ' warning' সিগন্যাল শর্তাদি এবং ' try' হ'ল মূলত ' ' এর একটি সরলিকৃত সংস্করণ tryCatch

সুতরাং আপনি সম্ভবত চান stop


24
এটি নিখুঁতভাবে কাজ করে। আর এগুলি এত অদ্ভুত, তাদের নিজস্ব কোনও দোষের মধ্যে না দিয়ে - এটির জন্য খুব ভাল ডিজাইনের ভাষা নকশা তৈরি করার অনেক আগে তৈরি করা হয়েছিল।
ফোরকান্ডওয়েত

5
লেখকদের মতে এটি স্কিম দ্বারা প্রচুর প্রভাবিত হয়েছিল, যা পুরানো এবং ভাল উভয়ই। আর 'লম্পি' তবে ফানি ডেটা স্ট্রাকচার সহ। আর এর "আকর্ষণীয়" অংশগুলি সম্ভবত সম্পর্কিত যে প্রচুর কনভেনশন অন্যান্য ভাষার থেকে পৃথক, বিশেষত সি-ভাষা পরিবার যে এটি সিন্টেক্সিকভাবে খুব নিকটেই রয়েছে to আমি অনুমান করব কারণ ভাষাটি এমন একটি পরিসংখ্যানবিদদের দ্বারা বিকশিত হয়েছিল যার বিকাশকারীদের একটি ভাল সরঞ্জামের প্রয়োজনের পরিবর্তে একটি ভাল সরঞ্জামের প্রয়োজন ছিল। শুধু যে 'ডট' ঠিক হয় একটি অক্ষর গ্রহণ করা একটি দীর্ঘ সময় নেয়।
KarlP

5
এখানে কয়েকটি বুনিয়াদি উদাহরণ দুর্দান্ত হবে, কেবলমাত্র উদ্ধৃতি দেওয়া হবে না। এখানে stackoverflow.com/a/23917007/54964
Léo লেয়পল হের্ৎস 준영

স্যানার ত্রুটি বার্তায় কীভাবে আর এর মধ্যে ত্রুটিটি নতুন করে লিখতে হবে তা অনুসন্ধান করার সময় আমি এই প্রশ্নে এসেছি, তবে ট্রেসটি অক্ষত রেখেছি (আপনি traceback()কী ভুল হয়েছে তা দেখার জন্য আপনি ত্রুটির পরে নির্বাহ করবেন )। ব্যবহার stopমধ্যে errorআর্গুমেন্ট tryCatchট্রেস আপ করবে জগাখিচুড়ি। যাইহোক, finallyযুক্তি একটি অতিরিক্ত বার্তা নিক্ষেপ করতে এবং ট্রেসকে দরকারী রাখবে। ঠিক অনন্য বিষয় নয়, তবে আমি মনে করি, উইন্ডো থেকে এই মন্তব্যটিকে লাথি মেরে কয়েক মিনিট এবং সংযমের হুমকি প্রদানের পক্ষে যথেষ্ট গুরুত্বপূর্ণ। :-)
মালি রিমোরকার


8

ডার্ক উল্লেখ করেছেন এমন বেস ফাংশনের বাইরে:

R.oo প্যাকেজ একটি থ্রো () ফাংশন যা খুবই দরকারী সহ অতিরিক্ত ব্যতিক্রম হ্যান্ডলিং কার্যকারিতা আছে। আপনি সাধারণ চেষ্টা বা ট্রাইচ্যাচ ফাংশন সহ ব্যতিক্রমগুলি ধরতে পারেন:

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: http://www1.maths.lth.se/help/R/R.oo/


8
হে হে। ও ও ছাড়া আর কি যথেষ্ট মজাদার নয়? ফ্লিপ হওয়ার জন্য দুঃখিত, এবং অবশ্যই আকর্ষণীয় উত্তরের জন্য ধন্যবাদ, তবে আমি উপরের সরল পুরানো স্টপ () নিয়ে যাব।
কাঁটাচামাই

1
আরও ওও আছে এখন। :)
Iterator

3
@ws। আর সম্পর্কে এত মজার কি? plotএকটি ফাংশন প্লট করে, try stop warnযেমনটি আপনি প্রত্যাশা করতেন সমস্ত কাজ এবং আমি যা করতে চাই তার প্রায় প্রতিটি জিনিসই ওয়ান লাইনার।
isomorphismes

4
প্রায়শই "ওয়ান-লাইনের শক্তি" কোনও ভাষার জন্য ভাল মেট্রিক নয়। আমাদের অনেকের জন্য পঠনযোগ্য, বোধগম্য কোডগুলি কম লাইনে ট্রাম্প করে। প্রকৃতপক্ষে, আমার কাছে অনেক কিছুই বোধগম্য নয় কারণ আমি একটি শিক্ষানবিস এবং আমি সেই অনুসারে প্রত্যাশাগুলি ক্রমাঙ্কিত করার চেষ্টা করি। তবে অন্যান্য ভাষাগুলি 0 থেকে জিনিস শেষ করার দিকে যাওয়া মোটামুটি স্বজ্ঞাত করে তোলে। আর মনে হয় যে চালাকের সংস্কৃতি গড়ে উঠেছে, ওয়ান-লাইনারগুলি পড়া শক্ত। আমি সর্বাধিক ইংরাজির মতো কোডের সংস্কৃতির পক্ষে যুক্তি দেব যা প্রায়শই রুবির মতো এক-লাইনারও হতে পারে।
ফিলিপ

6

আসলে আপনার stopifnotকোডটিতে স্যানিটি চেকগুলি প্রয়োগ করতে ফাংশনটি খুব সুবিধাজনক। এটি বেশ কয়েকটি যৌক্তিক অভিব্যক্তি গ্রহণ করে এবং যদি তাদের মধ্যে কেউ মিথ্যা হিসাবে মূল্যায়ন করে তবে একটি ত্রুটি প্রদান করে।

উদাহরণ: ডেটাফ্রেমে 'df' তে কলাম 'সি' রয়েছে কিনা তা পরীক্ষা করতে:

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

এটি নিম্নলিখিত ত্রুটি নিক্ষেপ করবে:

Error: !is.null(df$c) is not TRUE

পাইথনের মতো শোনাচ্ছে assert(...)...
জোশিয়ার যোদার

1

কলামটি বিদ্যমান কিনা তা আপনি যাচাই করতে পারেন এবং আপনার যা ইচ্ছা তা করতে পারেন।
মনে করুন কোনও data.frameনামযুক্ত df1এবং কলামটি col1বিদ্যমান কিনা তা যাচাই করে দেখছেন:

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

অথবা

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

এই ক্ষেত্রে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.