@ ফ্যাবিয়ান-ওয়ার্নারের সরবরাহকৃত উত্তরটি দুর্দান্ত, তবে বস্তুগুলির একাধিক শ্রেণি থাকতে পারে এবং "ফ্যাক্টর" অগত্যা প্রথম class(yes)
পাঠানো হতে পারে না , তাই সমস্ত শ্রেণীর বৈশিষ্ট্যগুলি পরীক্ষা করার জন্য আমি এই ছোট্ট পরিবর্তনটি প্রস্তাব করছি:
safe.ifelse <- function(cond, yes, no) {
class.y <- class(yes)
if ("factor" %in% class.y) { # Note the small condition change here
levels.y = levels(yes)
}
X <- ifelse(cond,yes,no)
if ("factor" %in% class.y) { # Note the small condition change here
X = as.factor(X)
levels(X) = levels.y
} else {
class(X) <- class.y
}
return(X)
}
আমি আর ডাব্লু ডেভেলপমেন্ট টিমের কাছে একটি অনুরোধ জমা দিয়েছি যাতে বেস :: আইফেলস () ব্যবহারের জন্য কোন বৈশিষ্ট্যগুলি সংরক্ষণ করতে হবে তার ব্যবহারকারী নির্বাচনের উপর ভিত্তি করে বৈশিষ্ট্যগুলি সংরক্ষণ করতে ডকুমেন্টেড বিকল্প যুক্ত করতে হবে। অনুরোধটি এখানে রয়েছে: https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16609 - এটি ইতিমধ্যে যেভাবে আগে থেকে চলেছে এই কারণেই এটি ইতিমধ্যে "WONTFIX" হিসাবে চিহ্নিত করা হয়েছে, তবে আমি কেন একটি সাধারণ সংযোজন R এর প্রচুর ব্যবহারকারীর মাথাব্যথা বাঁচাতে পারে তার একটি ফলো-আপ যুক্তি সরবরাহ করেছি। সম্ভবত আপনার "+1" বাগ বাগের থ্রেডটি আর কোর টিমকে দ্বিতীয় দর্শন নিতে উত্সাহিত করবে।
সম্পাদনা: এখানে একটি আরও ভাল সংস্করণ যা ব্যবহারকারীকে "কনড" (ডিফল্ট ifelse () আচরণ), "হ্যাঁ", উপরের কোড অনুসারে আচরণ, বা "না", ক্ষেত্রে যে বৈশিষ্ট্যগুলি সংরক্ষণ করতে হবে তা নির্দিষ্ট করার অনুমতি দেয় the "না" মানের বৈশিষ্ট্য আরও ভাল:
safe_ifelse <- function(cond, yes, no, preserved_attributes = "yes") {
# Capture the user's choice for which attributes to preserve in return value
preserved <- switch(EXPR = preserved_attributes, "cond" = cond,
"yes" = yes,
"no" = no);
# Preserve the desired values and check if object is a factor
preserved_class <- class(preserved);
preserved_levels <- levels(preserved);
preserved_is_factor <- "factor" %in% preserved_class;
# We have to use base::ifelse() for its vectorized properties
# If we do our own if() {} else {}, then it will only work on first variable in a list
return_obj <- ifelse(cond, yes, no);
# If the object whose attributes we want to retain is a factor
# Typecast the return object as.factor()
# Set its levels()
# Then check to see if it's also one or more classes in addition to "factor"
# If so, set the classes, which will preserve "factor" too
if (preserved_is_factor) {
return_obj <- as.factor(return_obj);
levels(return_obj) <- preserved_levels;
if (length(preserved_class) > 1) {
class(return_obj) <- preserved_class;
}
}
# In all cases we want to preserve the class of the chosen object, so set it here
else {
class(return_obj) <- preserved_class;
}
return(return_obj);
} # End safe_ifelse function
if_else()
ডাইপ্লায়ার প্যাকেজে এখন একটি ফাংশন রয়েছে যাifelse
ডেট অবজেক্টের সঠিক শ্রেণি বজায় রাখার জন্য বিকল্পী হতে পারে - এটি সাম্প্রতিক উত্তর হিসাবে নীচে পোস্ট করা হয়েছে । আমি এখানে এটি মনোযোগ আনছি কারণ এটি একটি ক্রেন প্যাকেজে ইউনিট-টেস্টেড এবং ডকুমেন্টেড এমন একটি ফাংশন সরবরাহ করে এই সমস্যাটির সমাধান করে, অন্যান্য উত্তরগুলির তুলনায় (এই মন্তব্য হিসাবে) এর আগে স্থান দেওয়া হয়েছিল।