আর: + = (সমান সমান) এবং সি ++ / সি # / জাভা ইত্যাদি থেকে ++ (প্লাস প্লাস) সমতুল্য?


উত্তর:



64

@ গ্রেগাকি'র অনুসরণ করে আপনি ইনফিক্স অপারেটর তৈরি করতে পারেন:

`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x

6
(+1) তবে সতর্কতার শব্দ। টাইপ করার x = %+=% y/2আয় x = (x + y)/2। প্রথম বন্ধনী যুক্ত করা, অর্থাৎ x = %+=% (y/2)সমস্যা সমাধান করে।
নরমসে

@knrumsey এটি কেন? আমি অনুমান করেছি বিভাগ একটি উচ্চতর অগ্রগতি অপারেটর হবে।
ডেভিড কেলি

@ ডেভিডকেলি নিশ্চিত নন আমি সেখানে আপনার সাথে আছি আমি একবারে একটি প্রকল্পে কাজ করে এই সমস্যাটিতে চলে এসেছি এবং সমস্যাটি খুঁজে পেতে আমার এক ঘন্টা সময় লেগেছে।
নরমসে

মনে রাখবেন আপনি কোনও ফাংশন পরিচালনা করছেন, সংযোজন করছেন না। ফাংশনগুলির সর্বাধিক নজরে রয়েছে তাই প্রথম বন্ধনী ছাড়াই এটি y কে পার্স করে ফাংশন ইনপুট হিসাবে বিভাগটি শৃঙ্খলের পরবর্তী ধাপে। প্রথম বন্ধনগুলি (y / 2) অপারেশনটিকে চেইনের শীর্ষে উন্নীত করে।
জাস্টিন

33

আর এর ধারণা নেই increment operator(যেমন সি +++ এর মধ্যে)। তবে, নিজেকে বাস্তবায়ন করা কঠিন নয়, উদাহরণস্বরূপ:

inc <- function(x)
{
 eval.parent(substitute(x <- x + 1))
}

সেক্ষেত্রে আপনি ফোন করবেন

x <- 10
inc(x)

তবে এটি ফাংশন কল ওভারহেডের সাথে পরিচয় করিয়ে দেয় তাই এটি নিজের টাইপ করার চেয়ে ধীরx <- x + 1 । আমার যদি ভুল না হয় তবে increment operatorসহজেই সংকলকের জন্য কাজ করার জন্য প্রবর্তন করা হয়েছিল, কারণ এটি কোডটি সরাসরি সেই মেশিন ভাষার নির্দেশিকায় রূপান্তর করতে পারে।


3
এই ফাংশনটি মান এবং তারপরে পোস্ট-ইনক্রিমেন্ট ++ এর মতো বৃদ্ধি করতে পারে না। এটি আরও বেশি ++ বা প্রিঙ্ক্রিমেন্ট ++ এর সাথে মিল।
মেগাট্রন

ভুল! সংকলনের কাজ সহজ করার জন্য বর্ধন প্রবর্তন করা হয়নি। প্রাথমিকভাবে কাউন্টারগুলি প্রয়োগ করার জন্য প্রফেসরগুলিতেINC নির্দেশনা প্রবর্তন করা হয়েছিল (সিএফ। ইন্টেল সফ্টওয়্যার বিকাশকারীর ম্যানুয়াল)। আমি উত্তর আপডেট করব।
banan3'14

19

আর-এর এই ক্রিয়াকলাপগুলি নেই কারণ আর (বেশিরভাগ) অবজেক্টগুলি অপরিবর্তনীয়। তারা পরিবর্তন হয় না। সাধারণত, যখন মনে হয় আপনি কোনও জিনিসকে সংশোধন করছেন, আপনি আসলে একটি অনুলিপি পরিবর্তন করছেন।


18
অপরিবর্তনযোগ্যতা বস্তুগুলির জন্য দুর্দান্ত / আকাঙ্ক্ষিত সম্পত্তি হলেও (পড়ুন: কম বাগগুলি) আমার মনে হয় না অপরিবর্তনীয়তা + + প্রশ্নের সাথে সম্পর্কিত। অন্যান্য ভাষায় + = অপরিবর্তনীয় প্রকারে প্রয়োগ করা যেতে পারে (। নেট এর স্ট্রিংয়ের মতো)। অপারেশনটি কেবল একটি নতুন অবজেক্ট তৈরি করে এবং প্রদত্ত ভেরিয়েবলটিকে সেই নতুন অবজেক্টে বরাদ্দ করে। অপরিচ্ছন্নতা বজায় রাখা হয় এবং পরিবর্তনশীল আপডেট করা হয়।
এসফুন 28

4
ভাল যুক্তি. অপরিচ্ছন্নতা অবশ্যই এই ধরণের অপারেশনটিকে কম প্রাকৃতিক করে তোলে।
হ্যাডলি

15

10 দ্বারা বৃদ্ধি এবং হ্রাস।

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

7
এই ফাংশনগুলি Hmisc4.1.0 সংস্করণ হিসাবে সরানো হয়েছে বলে মনে হচ্ছে।
llasram

@ আল্লাসরাম সেই স্বরলিপিটি দেখে, আমি কাউকে দোষ দিতে পারি না।
bers

5

এই ধরণের জিনিসটিতে সহায়তা করার জন্য আমরা একটি প্যাকেজ, রোপারেটর প্রকাশ করেছি। আপনি এ সম্পর্কে এখানে আরও পড়তে পারেন: https://happylittlescriptts.blogspot.com/2018/09/make-your-r-code-nicer-with-roperators.html

install.packages('roperators')
require(roperators)

x <- 1:3
x %+=% 1; x
x %-=% 3; x
y <- c('a', 'b', 'c')
y %+=% 'text'; y
y %-=% 'text'; y

# etc

3

আমরা ওভাররাইড করতে পারি +। যদি অ্যানারি +ব্যবহৃত হয় এবং এর যুক্তি নিজেই একটি অ্যানারি +কল হয়, তবে কলিং পরিবেশে প্রাসঙ্গিক চলক বৃদ্ধি করুন।

`+` <- function(e1,e2){
    # if unary `+`, keep original behavior
    if(missing(e2)) {
      s_e1 <- substitute(e1)
      # if e1 (the argument of unary +) is itself an unary `+` operation
      if(length(s_e1) == 2 && 
         identical(s_e1[[1]], quote(`+`)) && 
         length(s_e1[[2]]) == 1){
        # increment value in parent environment
        eval.parent(substitute(e1 <- e1 + 1,list(e1 = s_e1[[2]])))
      # else unary `+` should just return it's input
      } else e1
    # if binary `+`, keep original behavior
    } else .Primitive("+")(e1,e2)
}

x <- 10
++x
x
# [1] 11

অন্যান্য ক্রিয়াকলাপগুলি পরিবর্তন হয় না:

x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11

যদিও আপনি সবকিছু ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কমিয়ে দেবেন না বা অন্য পরিবেশে এটি করুন এবং নিশ্চিত করুন যে এই নির্দেশাবলীতে আপনার কাছে বড় লুপ নেই।

আপনি কেবল এটি করতে পারেন:

`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2

-1

এটি করার আরও একটি উপায় আছে, যা আমি খুব সহজ বলে মনে করি, সম্ভবত কিছুটা সাহায্য বন্ধ হতে পারে

আমি <<-এই পরিস্থিতির জন্য ব্যবহার করি অপারেটররা <<-মূল পরিবেশকে মান নির্ধারণ করে

inc <- function(x)
{
   x <<- x + 1
}

এবং আপনি এটি পছন্দ করতে পারেন

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