คำตอบ:
ไม่ไม่เห็น: R นิยามภาษา: ผู้ประกอบการ
การติดตาม @ GregaKešpretคุณสามารถสร้างโอเปอเรชั่นมัด:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
x = (x + y)/2
การเพิ่มวงเล็บคือx = %+=% (y/2)
แก้ปัญหา
R ไม่มีแนวคิดของincrement operator
(เช่น ++ ใน C) อย่างไรก็ตามมันก็ไม่ยากที่จะนำไปใช้กับตัวเองตัวอย่างเช่น:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
ในกรณีที่คุณจะโทร
x <- 10
inc(x)
อย่างไรก็ตามมันแนะนำค่าใช้จ่ายการเรียกใช้ฟังก์ชั่นดังนั้นจึงช้ากว่าการพิมพ์x <- x + 1
ตัวเอง ถ้าฉันไม่เข้าใจผิดincrement operator
ถูกแนะนำให้ทำให้คอมไพเลอร์ง่ายขึ้นเพราะมันสามารถแปลงรหัสเป็นคำสั่งภาษาเครื่องเหล่านั้นโดยตรง
INC
การเรียนการสอนถูกนำมาใช้ในโปรเซสเซอร์เป็นหลักสำหรับการใช้เคาน์เตอร์ (cf. คู่มือนักพัฒนาซอฟต์แวร์ Intel) ฉันจะอัปเดตคำตอบ
R ไม่มีการดำเนินการเหล่านี้เพราะวัตถุ (ส่วนใหญ่) ใน R ไม่เปลี่ยนรูป พวกเขาจะไม่เปลี่ยนแปลง โดยทั่วไปเมื่อดูเหมือนว่าคุณกำลังแก้ไขวัตถุคุณกำลังแก้ไขสำเนาจริง ๆ
เราเปิดตัวแพ็คเกจ 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
+
เราสามารถแทนที่ หาก+
มีการใช้งานยูนารีและอาร์กิวเมนต์ของมันคือการ+
โทรแบบยูนารีดังนั้นให้เพิ่มตัวแปรที่เกี่ยวข้องในสภาพแวดล้อมการโทร
`+` <- 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
มีอีกวิธีหนึ่งในการทำเช่นนี้ซึ่งฉันพบว่าง่ายมากอาจจะช่วยได้บ้าง
ฉันใช้<<-
สำหรับสถานการณ์เหล่านี้ตัวดำเนินการ<<-
กำหนดค่าให้กับสภาพแวดล้อมหลัก
inc <- function(x)
{
x <<- x + 1
}
และคุณสามารถเรียกมันว่าเหมือน
x <- 0
inc(x)
x += 1
หรือx++
-x = x + 1
ทำงาน