อะไรคือความแตกต่างระหว่าง“ =” และ“ <-” ผู้ประกอบการที่ได้รับมอบหมายใน R?


712

อะไรคือความแตกต่างระหว่างผู้ประกอบการที่ได้รับมอบหมาย=และ<-ใน R?

ฉันรู้ว่าผู้ประกอบการแตกต่างกันเล็กน้อยตามตัวอย่างนี้แสดงให้เห็น

x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"

แต่นี่คือความแตกต่างเท่านั้น?


45
ดังที่กล่าวไว้ที่นี่ต้นกำเนิดของ<-สัญลักษณ์มาจากคีย์บอร์ด APL รุ่นเก่าที่มี<-ปุ่มเดียว
joran

คำตอบ:


97

อะไรคือความแตกต่างระหว่างผู้ประกอบการที่ได้รับมอบหมาย=และ<-ใน R?

ดังที่ตัวอย่างของคุณแสดง=และ<-มีลำดับความสำคัญของโอเปอเรเตอร์ที่แตกต่างกันเล็กน้อย (ซึ่งกำหนดลำดับของการประเมินเมื่อผสมในนิพจน์เดียวกัน) ในความเป็นจริง?Syntaxใน R ให้ตารางตัวดำเนินการลำดับความสำคัญจากสูงสุดไปต่ำสุด:

-> ->>’           rightwards assignment<- <<-’           assignment (right to left)=’                assignment (right to left)

แต่นี่คือความแตกต่างเท่านั้น?

เนื่องจากคุณถูกถามเกี่ยวกับผู้ดำเนินการที่ได้รับมอบหมาย : ใช่นั่นคือความแตกต่างเท่านั้น อย่างไรก็ตามคุณจะได้รับการให้อภัยจากการเชื่อเป็นอย่างอื่น แม้แต่เอกสาร R ของการ?assignOpsอ้างสิทธิ์ว่ามีความแตกต่างมากขึ้น:

โอเปอเรเตอร์<-สามารถใช้งานได้ทุกที่ในขณะที่โอเปอเรเตอร์=ได้รับอนุญาตที่ระดับบนสุดเท่านั้น (เช่นในนิพจน์ทั้งหมดที่พิมพ์ที่คอมมานด์พรอมต์) หรือเป็นหนึ่งในนิพจน์ย่อยในรายการนิพจน์ที่ถูกโยง

ให้ไม่ใส่ดีจุดเกินไปในมันเอกสาร R คือ (อย่างละเอียด) ผิด [ 1 ] นี่เป็นเรื่องง่ายที่จะแสดง: เราเพียงแค่ต้องค้นหาตัวอย่างเคาน์เตอร์ของตัว=ดำเนินการที่ไม่ใช่ (a) ที่ระดับสูงสุดและ (b) นิพจน์ย่อยในรายการของนิพจน์ (เช่น{…; …}) - ไม่มีความกังวลใจเพิ่มเติม:

x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1

เห็นได้ชัดว่าเราได้ทำการมอบหมายใช้=นอกบริบท (a) และ (b) เหตุใดเอกสารของคุณลักษณะแกนภาษา R จึงผิดมาหลายทศวรรษ

เป็นเพราะในไวยากรณ์ของ R สัญลักษณ์=มีความหมายที่แตกต่างกันสองประการที่ทำให้เกิดความสับสนเป็นประจำ:

  1. ความหมายแรกคือในฐานะที่เป็นผู้ประกอบการที่ได้รับมอบหมาย นี่คือทั้งหมดที่เราพูดถึง
  2. ความหมายที่สองไม่ใช่โอเปอเรเตอร์ แต่เป็นโทเค็นของไวยากรณ์ที่ส่งสัญญาณการตั้งชื่ออาร์กิวเมนต์ที่ผ่านในการเรียกใช้ฟังก์ชัน ซึ่งแตกต่างจาก=ผู้ประกอบการที่ไม่ได้ดำเนินการที่รันไทม์มันเพียงเปลี่ยนวิธีการแยกวิเคราะห์การแสดงออก

มาดูกัน.

ในรหัสใด ๆ ของแบบฟอร์มทั่วไป ...

‹function_name›(‹argname› = ‹value›,)
‹function_name›(‹args›, ‹argname› = ‹value›,)

=เป็นโทเค็นที่กำหนดอาร์กิวเมนต์การส่งผ่านชื่อ: ไม่ใช่ตัวดำเนินการกำหนด นอกจากนี้ห้าม=ทั้งหมดในบริบทของประโยค:

if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …

สิ่งเหล่านี้จะทำให้เกิดข้อผิดพลาด“ ที่ไม่คาดคิด '=' เป็นใน

ในบริบทอื่นใด=อ้างถึงการเรียกผู้ดำเนินการที่ได้รับมอบหมาย โดยเฉพาะอย่างยิ่งเพียงใส่วงเล็บรอบ subexpression ทำให้ใด ๆ ข้างต้น (ก) ที่ถูกต้องและ (ข) ได้รับมอบหมาย ตัวอย่างเช่นการดำเนินการต่อไปนี้ได้รับมอบหมาย:

median((x = 1 : 10))

แต่ยัง:

if (! (nf = length(from))) return()

ตอนนี้คุณอาจคัดค้านว่ารหัสนั้นเลวร้าย (และคุณอาจถูก) แต่ฉันเอาโค้ดนี้มาจากbase::file.copyฟังก์ชั่น (แทนที่<-ด้วย=) - มันเป็นรูปแบบที่แพร่หลายในฐาน code R ส่วนใหญ่

คำอธิบายต้นฉบับโดย John Chambersซึ่งเอกสาร R น่าจะอยู่บนพื้นฐานของความเป็นจริงอธิบายนี้อย่างถูกต้อง:

=อนุญาตให้[ มอบหมาย] เพียงสองแห่งในไวยากรณ์: ที่ระดับบนสุด (เป็นโปรแกรมที่สมบูรณ์หรือการแสดงออกของผู้ใช้พิมพ์); และเมื่อแยกออกจากโครงสร้างโลจิคัลโดยรอบ, วงเล็บปีกกาหรือวงเล็บพิเศษ


คำสารภาพ: ฉันโกหกก่อนหน้านี้ มีเป็นหนึ่งความแตกต่างระหว่างเพิ่มเติม=และ<-ผู้ประกอบการ: พวกเขาเรียกฟังก์ชั่นที่แตกต่างกัน โดยค่าเริ่มต้นฟังก์ชั่นเหล่านี้จะทำสิ่งเดียวกัน แต่คุณสามารถแทนที่หนึ่งในนั้นแยกกันเพื่อเปลี่ยนพฤติกรรม ในทางตรงกันข้าม<-และ->(จากซ้ายไปขวา) ถึงแม้ว่าจะมีความแตกต่างทางวากยสัมพันธ์มักเรียกฟังก์ชั่นเดียวกันเสมอ การเอาชนะอย่างใดอย่างหนึ่งยังแทนที่อีกด้วย รู้นี้เป็นจริงไม่ค่อยแต่ก็สามารถนำมาใช้สำหรับบางแง่สนุก


1
เกี่ยวกับความสำคัญและข้อผิดพลาดในเอกสารของ R ความสำคัญของความ?ถูกต้องอยู่ระหว่าง=และ<-ซึ่งมีผลกระทบที่สำคัญเมื่อเอาชนะ? และแทบไม่มีใครอื่น
Moody_Mudskipper

@Moody_Mudskipper นั่นแปลกประหลาด! คุณดูเหมือนจะถูกต้อง แต่ตามรหัสที่มา ( main/gram.y) ความสำคัญของ?การจัดทำเอกสารอย่างถูกต้องและต่ำกว่าทั้งสองและ= <-
Konrad Rudolph

ฉันไม่ได้พูด C แต่ฉันคิดว่ามัน=จะได้รับการดูแลเป็นพิเศษก่อนที่จะสร้างต้นไม้แจง อาจเกี่ยวข้องกับอาร์กิวเมนต์ของฟังก์ชั่นมันสมเหตุสมผลแล้วที่foo(x = a ? b)เราจะค้นหา=ก่อนที่จะทำการวิเคราะห์คำที่เหลือ
Moody_Mudskipper


2
@Moody_Mudskipper FWIW นี้ได้รับการแก้ไขในที่สุด 4.0.0
Konrad Rudolph

661

ความแตกต่างในโอเปอเรเตอร์การมอบหมายจะชัดเจนขึ้นเมื่อคุณใช้เพื่อตั้งค่าอาร์กิวเมนต์ในการเรียกใช้ฟังก์ชัน ตัวอย่างเช่น:

median(x = 1:10)
x   
## Error: object 'x' not found

ในกรณีนี้xมีการประกาศภายในขอบเขตของฟังก์ชันดังนั้นจึงไม่มีอยู่ในพื้นที่ทำงานของผู้ใช้

median(x <- 1:10)
x    
## [1]  1  2  3  4  5  6  7  8  9 10

ในกรณีนี้xมีการประกาศในพื้นที่ทำงานของผู้ใช้ดังนั้นคุณสามารถใช้งานได้หลังจากการเรียกใช้ฟังก์ชันเสร็จสมบูรณ์


มีการกำหนดค่าตามความชอบทั่วไประหว่างชุมชน R เพื่อใช้<-สำหรับการมอบหมาย (นอกเหนือจากในลายเซ็นของฟังก์ชัน) สำหรับความเข้ากันได้กับ S-Plus รุ่นเก่า (มาก) โปรดทราบว่าช่องว่างช่วยอธิบายสถานการณ์เช่นนี้

x<-3
# Does this mean assignment?
x <- 3
# Or less than?
x < -3

R IDEs ส่วนใหญ่มีแป้นพิมพ์ลัดเพื่อให้<-พิมพ์ง่ายขึ้น Ctrl+ =ในสถาปนิก, Alt+ -ใน RStudio ( Option+ -ภายใต้ macOS), Shift+ -(ขีดล่าง) ใน emacs + ESS


ถ้าคุณต้องการเขียน=ไป<-แต่ต้องการที่จะใช้สัญลักษณ์ที่ได้รับมอบหมายร่วมกันมากขึ้นสำหรับรหัสที่ออกสู่สาธารณะ (บน CRAN ตัวอย่าง) แล้วคุณสามารถใช้หนึ่งในtidy_*ฟังก์ชั่นในformatRแพคเกจที่จะเปลี่ยนโดยอัตโนมัติด้วย=<-

library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5

คำตอบของคำถาม "ทำไมจึงx <- y = 5เกิดข้อผิดพลาด แต่ไม่ใช่x <- y <- 5" คือ "มันลงไปจนถึงเวทย์มนตร์ที่มีอยู่ในตัวแยกวิเคราะห์" ไวยากรณ์ของ R ประกอบด้วยกรณีที่ไม่ชัดเจนจำนวนมากที่ต้องแก้ไขในทางใดทางหนึ่ง parser เลือกที่จะแก้ไขบิตของนิพจน์ในคำสั่งต่าง ๆ ขึ้นอยู่กับว่ามีการใช้=หรือ<-ไม่

เพื่อให้เข้าใจสิ่งที่เกิดขึ้นคุณต้องรู้ว่าการมอบหมายนั้นส่งคืนค่าที่ถูกมอบหมายอย่างเงียบ ๆ print(x <- 2 + 3)คุณจะเห็นว่าชัดเจนมากขึ้นโดยการพิมพ์อย่างชัดเจนเช่น

ประการที่สองจะชัดเจนกว่าถ้าเราใช้เครื่องหมายนำหน้าสำหรับการกำหนด ดังนั้น

x <- 5
`<-`(x, 5)  #same thing

y = 5
`=`(y, 5)   #also the same thing

โปรแกรมแยกวิเคราะห์ตีความx <- y <- 5เป็น

`<-`(x, `<-`(y, 5))

เราอาจคาดหวังว่าx <- y = 5จะเป็นเช่นนั้น

`<-`(x, `=`(y, 5))

แต่จริงๆแล้วมันถูกตีความว่าเป็น

`=`(`<-`(x, y), 5)

นี่เป็นเพราะ=มีความสำคัญต่ำกว่า<-ที่แสดงใน?Syntaxหน้าความช่วยเหลือ


4
นอกจากนี้ยังเป็นที่กล่าวถึงในบทที่ 8.2.26 ของอานรกโดยแพทริกเบิร์นส์ (ไม่ฉัน แต่อย่างไรก็ตามคำแนะนำ)
Uwe

3
แต่มีผลเช่นเดียวกับmedian((x = 1:10)) median(x <- 1:10)
Francesco Napolitano

2
ฉันไม่ได้พิจารณาทางลัดจริงๆในกรณีใด ๆ ที่คุณกดปุ่มหมายเลขเดียวกัน
yosemite_k

5
ฉันเพิ่งรู้ว่าคำอธิบายของคุณเกี่ยวกับวิธีx <- x = 5ตีความถูกผิดเล็กน้อย: ในความเป็นจริงแล้ว R ตีความว่ามันเป็น​`<-<-`(x, y = 5, value = 5)(ซึ่งตัวมันเองจะมากหรือน้อยเทียบเท่าtmp <- x; x <- `<-<-`(tmp, y = 5, value = 5)) อ๊ะ!
Konrad Rudolph

4
…และฉันเพิ่งรู้ว่าส่วนแรกของคำตอบนี้ไม่ถูกต้องและโชคไม่ดีที่ทำให้เข้าใจผิดเพราะมันทำให้เกิดความเข้าใจผิดทั่วไป: วิธีที่คุณใช้=ในการเรียกใช้ฟังก์ชั่นไม่ทำงานที่ได้รับมอบหมายและไม่ใช่ผู้ดำเนินการมอบหมาย มันเป็นนิพจน์ R ที่แยกวิเคราะห์อย่างสิ้นเชิงซึ่งเพิ่งเกิดขึ้นเพื่อใช้ตัวละครเดียวกัน นอกจากนี้รหัสที่คุณแสดงไม่ได้“ ประกาศ” xในขอบเขตของฟังก์ชัน การประกาศฟังก์ชั่นดำเนินการประกาศดังกล่าว การเรียกใช้ฟังก์ชันไม่ (มีความซับซ้อนเพิ่มขึ้นเล็กน้อยกับ...อาร์กิวเมนต์ที่ตั้งชื่อ)
Konrad Rudolph

103

คู่มือสไตล์ R ของ Google ช่วยลดความยุ่งยากของปัญหาโดยการห้าม "=" สำหรับการมอบหมาย ไม่ใช่ตัวเลือกที่แย่

https://google.github.io/styleguide/Rguide.xml

คู่มือ R นั้นมีรายละเอียดที่ดีสำหรับผู้ให้บริการทั้ง 5 ราย

http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html


133
ข้อเสียของการที่ได้รับมอบหมายโดยไม่ได้ตั้งใจx<-yเมื่อx < -yถูกความหมาย vexes =ฉันมากที่ผมเองชอบ การมีรหัสของคุณขึ้นอยู่กับช่องว่างที่มีอยู่นั้นดูไม่ดีสำหรับฉัน มันก็โอเคที่จะแนะนำการเว้นวรรคเป็นคำแนะนำรูปแบบ แต่สำหรับรหัสของคุณที่จะทำงานแตกต่างกันไม่ว่าจะมีพื้นที่ว่างหรือไม่? ถ้าคุณฟอร์แมตโค้ดของคุณใหม่หรือใช้การค้นหาและแทนที่บางครั้งช่องว่างอาจหายไปได้ =ที่ไม่ได้เป็นปัญหากับ IIUC การห้าม=เท่ากับต้องมี " <- "; นั่นคือ 3 ตัวอักษรรวมถึงช่องว่างไม่ใช่แค่ " <-"
Matt Dowle

12
โปรดทราบว่าการที่ไม่ใช่ 0 จะถูกพิจารณาTRUEโดย R ดังนั้นหากคุณตั้งใจจะทดสอบว่าxน้อยกว่า-yคุณอาจเขียนif (x<-y)ว่าจะไม่เตือนหรือผิดพลาดใดและดูเหมือนว่าจะทำงานได้ดี มันจะFALSEเมื่อy=0แม้ว่า
Matt Dowle

4
หากคุณห้าม=และใช้งาน<- แล้วยากที่จะยืนยันว่าgrep "[^<]<-[^ ]" *.Rไม่จำเป็นต้องมีขั้นตอนเพิ่มเติม =ไม่ต้องการกgrep.
Matt Dowle

34
ทำไมต้องทำร้ายดวงตาและนิ้วด้วย<-หากใช้=? ใน 99.99% ของเวลา=เป็นเรื่องปกติ บางครั้งคุณต้องการ<<-ซึ่งเป็นประวัติศาสตร์ที่แตกต่าง
เฟอร์นันโด

10
การโฟกัสที่ <- อาจเป็นหนึ่งในสาเหตุของการขาด + + และ - =
Chris

37

x = y = 5เท่ากับx = (y = 5)เพราะผู้ประกอบการที่ได้รับมอบหมาย "กลุ่ม" จากขวาไปซ้ายซึ่งใช้งานได้ ความหมาย: มอบหมาย 5 ถึงy, ออกจากหมายเลข 5; และกำหนดแล้วที่ x5

นี่ไม่ใช่สิ่งเดียวกัน(x = y) = 5ซึ่งไม่ได้ผล! ความหมาย: กำหนดค่าของyถึงxออกจากค่าของy; แล้วมอบหมาย 5 ให้กับอืมม ... อะไรกันแน่?

เมื่อคุณผสมที่แตกต่างกันของผู้ประกอบการที่ได้รับมอบหมาย, ผูกแน่นกว่า<- =ดังนั้นx = y <- 5ถูกตีความว่าx = (y <- 5)เป็นกรณีที่เหมาะสม

น่าเสียดายที่x <- y = 5ตีความว่า(x <- y) = 5เป็นกรณีที่ไม่ได้ผล!

ดู?Syntaxและ?assignOpsสำหรับความสำคัญ (ผูกพัน) และกฎการจัดกลุ่ม


ใช่ดังที่คำตอบของKonrad Rudolphกล่าว<- <<-ไว้ข้างต้น= ในตารางที่มีมาก่อนซึ่งหมายความว่า<-จะต้องออกก่อน ดังนั้นควรจะดำเนินการเป็นx <- y = 5 (x <- y) = 5
Nick Dong

1
@Nick Dong ใช่แน่นอน เป็นประโยชน์ตารางประกอบ precedendence เป็นเอกสารอย่างไม่น่าสงสัยใน? ไวยากรณ์ {}
Steve Pitchers

33

ตามที่ John Chambers ผู้ดำเนินการ=ได้รับอนุญาตที่ "ระดับสูงสุด" ซึ่งหมายความว่าไม่ได้รับอนุญาตในโครงสร้างการควบคุมเช่นifทำให้ข้อผิดพลาดในการเขียนโปรแกรมต่อไปนี้ผิดกฎหมาย

> if(x = 0) 1 else x
Error: syntax error

ในขณะที่เขาเขียนว่า "การไม่อนุญาตแบบฟอร์มการมอบหมายใหม่ [=] ในนิพจน์การควบคุมหลีกเลี่ยงข้อผิดพลาดในการเขียนโปรแกรม (เช่นตัวอย่างด้านบน) ที่มีแนวโน้มที่จะมีตัวดำเนินการเท่ากันมากกว่าการมอบหมายแบบ S อื่น ๆ "

คุณสามารถจัดการกับสิ่งนี้ได้หากมัน "แยกจากโครงสร้างโลจิคัลโดยรอบ, วงเล็บปีกกาหรือวงเล็บพิเศษ" ดังนั้นif ((x = 0)) 1 else xจะได้ผล

ดูhttp://developer.r-project.org/equalAssign.html


11
มันเป็นข้อผิดพลาดทั่วไปx==0มีความหมายเกือบทุกครั้งแทน
แอรอนออกจาก Stack Overflow

14
อาใช่ฉันมองข้ามว่าคุณพูดว่า "การเขียนโปรแกรมผิดพลาด" เป็นข่าวดีจริง ๆ ที่ทำให้เกิดข้อผิดพลาด และเป็นเหตุผลที่ดีที่ชอบการx=0มอบหมายมากกว่าx<-0!
Steve Pitchers

7
ใช่มันเป็นสิ่งที่ดีที่ทำให้เกิดข้อผิดพลาดแม้ว่าฉันจะวาดบทเรียนที่แตกต่างเกี่ยวกับสิ่งที่ต้องการ ผมเลือกที่จะใช้=น้อยที่สุดเท่าที่เป็นไปได้เพราะ=และ==ดูคล้าย
Aaron ออกจาก Stack Overflow

2
วิธีที่นำเสนอตัวอย่างนี้แปลกสำหรับฉัน if(x = 0) 1 else xมีข้อผิดพลาดช่วยฉันค้นหาและแก้ไขข้อผิดพลาด if(x <- 1) 1 else xไม่โยนข้อผิดพลาดและสับสนมาก
Gregor Thomas

3
ฉันหมายถึงผู้ตรวจสอบข้อผิดพลาดที่เป็นประโยชน์จริง ๆจะโยนข้อผิดพลาดที่นั่นและพูดว่า "คุณมีรหัสที่ไร้ประโยชน์ซึ่งจะคืนelseค่าเสมอคุณหมายถึงเขียนด้วยวิธีนั้นหรือไม่" แต่นั่นอาจเป็นความฝันของท่อ ...
TylerH

26

ผู้ประกอบการ<-และ=กำหนดเข้าสู่สภาพแวดล้อมที่พวกเขาได้รับการประเมิน โอเปอเรเตอร์<-สามารถใช้งานได้ทุกที่ในขณะที่โอเปอเรเตอร์=ได้รับอนุญาตที่ระดับบนสุดเท่านั้น (เช่นในนิพจน์ทั้งหมดที่พิมพ์ที่คอมมานด์พรอมต์) หรือเป็นหนึ่งในนิพจน์ย่อยในรายการนิพจน์ที่ถูกโยง


8
ฉันคิดว่า "ระดับสูงสุด" หมายถึงที่ระดับคำสั่งมากกว่าระดับการแสดงออก ดังนั้นx <- 42คำสั่งของตัวเองคือ; ในif (x <- 42) {}นั้นจะเป็นการแสดงออกและไม่ถูกต้อง เพื่อความชัดเจนสิ่งนี้ไม่เกี่ยวกับว่าคุณอยู่ในสภาพแวดล้อมระดับโลกหรือไม่
Steve Pitchers

1
สิ่งนี้:“ ตัวดำเนินการ = ได้รับอนุญาตเฉพาะที่ระดับสูงสุด” เป็นการเข้าใจผิดที่จัดขึ้นอย่างกว้างขวางและผิดทั้งหมด
Konrad Rudolph

สิ่งนี้ไม่เป็นความจริง - ตัวอย่างเช่นงานนี้แม้ว่าการมอบหมายจะไม่เป็นการแสดงออกที่สมบูรณ์:1 + (x = 2)
Pavel Minaev

1
เพื่อชี้แจงความคิดเห็นของ KonradRudolph และ PavelMinaev ฉันคิดว่ามันแรงเกินกว่าที่จะบอกว่ามันผิดทั้งหมด แต่มีข้อยกเว้นซึ่งเมื่อมัน "แยกจากโครงสร้างเชิงตรรกะโดยรอบวงเล็บหรือวงเล็บคู่เพิ่มเติม"
Aaron ออกจาก Stack Overflow

หรือในfunction() x = 1, repeat x = 1, if (TRUE) x = 1....
Moody_Mudskipper

6

สิ่งนี้อาจเพิ่มความเข้าใจในความแตกต่างระหว่างตัวดำเนินการทั้งสอง:

df <- data.frame(
      a = rnorm(10),
      b <- rnorm(10)
)

สำหรับองค์ประกอบแรก R ได้กำหนดค่าและชื่อที่เหมาะสมในขณะที่ชื่อขององค์ประกอบที่สองดูแปลก ๆ

str(df)
# 'data.frame': 10 obs. of  2 variables:
#  $ a             : num  0.6393 1.125 -1.2514 0.0729 -1.3292 ...
#  $ b....rnorm.10.: num  0.2485 0.0391 -1.6532 -0.3366 1.1951 ...

รุ่น R 3.3.2 (2016-10-31); macOS Sierra 10.12.1


6
คุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับสาเหตุที่เกิดเหตุการณ์นี้ / สิ่งที่เกิดขึ้นที่นี่? (คำใบ้: data.frameพยายามใช้ชื่อของตัวแปรที่ให้ไว้เป็นชื่อขององค์ประกอบในกรอบข้อมูล)
Ben Bolker

แค่คิดว่านี่อาจเป็นข้อผิดพลาดหรือไม่? และถ้าเป็นเช่นนั้นฉันจะรายงานได้อย่างไรและที่ไหน
เดนิสราซูเลฟ

7
มันไม่ใช่ข้อผิดพลาด ฉันพยายามบอกคำตอบในความคิดเห็นของฉันด้านบน make.names("b <- rnorm(10)")เมื่อตั้งชื่อขององค์ประกอบวิจัยจะใช้เทียบเท่า
Ben Bolker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.