R: + = (บวกเท่ากับ) และ ++ (บวกบวก) เทียบเท่าจาก c ++ / c # / java เป็นต้น?


คำตอบ:



64

การติดตาม @ GregaKešpretคุณสามารถสร้างโอเปอเรชั่นมัด:

`%+=%` = 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

@knrumsey ทำไมถึงเป็นเช่นนั้น ฉันจะเดาได้ว่าการแบ่งจะเป็นตัวดำเนินการที่สูงกว่า
David Kelley

@DavidKelley ไม่แน่ใจ ฉันอยู่กับคุณที่นั่น ฉันพบปัญหานี้ในโครงการหนึ่งครั้งและใช้เวลาหนึ่งชั่วโมงในการค้นหาปัญหา
knrumsey

จำไว้ว่าคุณกำลังใช้งานฟังก์ชั่นโดยไม่ต้องเพิ่ม ฟังก์ชั่นมีความสำคัญสูงสุดดังนั้นโดยไม่ต้องวงเล็บมันแยกวิเคราะห์ y เป็นฟังก์ชั่นการป้อนข้อมูลด้วยการแบ่งเป็นขั้นตอนต่อไปลงในห่วงโซ่ เครื่องหมายวงเล็บยกระดับการดำเนินการ (y / 2) ไปที่ด้านบนของห่วงโซ่
Justin

33

R ไม่มีแนวคิดของincrement operator(เช่น ++ ใน C) อย่างไรก็ตามมันก็ไม่ยากที่จะนำไปใช้กับตัวเองตัวอย่างเช่น:

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

ในกรณีที่คุณจะโทร

x <- 10
inc(x)

อย่างไรก็ตามมันแนะนำค่าใช้จ่ายการเรียกใช้ฟังก์ชั่นดังนั้นจึงช้ากว่าการพิมพ์x <- x + 1ตัวเอง ถ้าฉันไม่เข้าใจผิดincrement operatorถูกแนะนำให้ทำให้คอมไพเลอร์ง่ายขึ้นเพราะมันสามารถแปลงรหัสเป็นคำสั่งภาษาเครื่องเหล่านั้นโดยตรง


3
ฟังก์ชั่นนี้ไม่สามารถคืนค่าและจากนั้นเพิ่มขึ้นเช่น postincrement ++ มันคล้ายกับ + = หรือ preincrement ++ มากขึ้น
Megatron

ไม่ถูกต้อง! ไม่แนะนำการเพิ่มเพื่อให้การทำงานของคอมไพเลอร์ง่ายขึ้น INCการเรียนการสอนถูกนำมาใช้ในโปรเซสเซอร์เป็นหลักสำหรับการใช้เคาน์เตอร์ (cf. คู่มือนักพัฒนาซอฟต์แวร์ Intel) ฉันจะอัปเดตคำตอบ
banan3'14

19

R ไม่มีการดำเนินการเหล่านี้เพราะวัตถุ (ส่วนใหญ่) ใน R ไม่เปลี่ยนรูป พวกเขาจะไม่เปลี่ยนแปลง โดยทั่วไปเมื่อดูเหมือนว่าคุณกำลังแก้ไขวัตถุคุณกำลังแก้ไขสำเนาจริง ๆ


18
ในขณะที่ความไม่สามารถเปลี่ยนแปลงได้นั้นเป็นคุณสมบัติที่ยอดเยี่ยม / เป็นที่ต้องการสำหรับวัตถุ (อ่าน: ข้อบกพร่องน้อยกว่า) ฉันไม่คิดว่าความไม่สามารถเปลี่ยนแปลงได้เกี่ยวข้องกับคำถาม + = ในภาษาอื่น ๆ + = สามารถใช้กับประเภทที่ไม่เปลี่ยนรูป (เช่นสตริงใน. net) การดำเนินการเพียงแค่สร้างวัตถุใหม่และกำหนดตัวแปรที่กำหนดให้กับวัตถุใหม่นั้น ความไม่สามารถเปลี่ยนแปลงได้รับการปรับปรุงและเปลี่ยนแปลงตัวแปร
SFun28

4
จุดดี. ความไม่สามารถเปลี่ยนได้แน่นอนทำให้การดำเนินการประเภทนี้เป็นธรรมชาติน้อยลง
hadley

15

เพิ่มขึ้นและลดลง 10

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

7
ดูเหมือนว่าฟังก์ชั่นเหล่านี้จะถูกลบออกจากHmiscเวอร์ชั่น 4.1.0 แล้ว
llasram

@llasram กำลังมองหาสัญกรณ์นั้นฉันไม่สามารถตำหนิใครได้
bers

5

เราเปิดตัวแพ็คเกจ roperators เพื่อช่วยในเรื่องนี้ คุณสามารถอ่านเพิ่มเติมได้ที่นี่: https://happylittlescripts.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.