แก้ไข: Hadley Wickham ชี้ให้เห็นว่าฉัน misspoke การตรวจสอบ CMD กำลังขว้างไปที่บันทึกไม่ใช่คำเตือน ฉันเสียใจอย่างมากสำหรับความสับสน มันเป็นการกำกับดูแลของฉัน
รุ่นสั้น ๆ
R CMD check
โยนบันทึกนี้ทุกครั้งที่ฉันใช้ไวยากรณ์การสร้างพล็อตที่สมเหตุสมผลใน ggplot2:
no visible binding for global variable [variable name]
ฉันเข้าใจว่าเหตุใดการตรวจสอบของ CM CM จึงเป็นเช่นนั้น แต่ดูเหมือนว่าจะทำให้เกิดความผิดทางอาญาทั้งเส้นเลือดของไวยากรณ์ที่มีเหตุผลอย่างอื่น ฉันไม่แน่ใจว่าต้องดำเนินการอย่างไรเพื่อให้พัสดุของฉันผ่านR CMD check
และเข้ารับการตรวจ CRAN
พื้นหลัง
Sascha Epskamp ก่อนหน้านี้โพสต์บนหลักปัญหาเดียวกัน ความแตกต่างที่ผมคิดว่าเป็นที่subset()
manpage 's บอกว่ามันได้รับการออกแบบสำหรับการใช้งานแบบโต้ตอบ
ในกรณีของฉันปัญหาไม่ได้จบไปsubset()
แต่เป็นคุณสมบัติหลักของggplot2
: data =
อาร์กิวเมนต์
ตัวอย่างของรหัสที่ฉันเขียนที่สร้างบันทึกเหล่านี้
นี่คือฟังก์ชันย่อยในแพ็คเกจของฉันที่เพิ่มคะแนนให้กับพล็อต:
JitteredResponsesByContrast <- function (data) {
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
R CMD check
ในการแยกวิเคราะห์รหัสนี้จะพูดว่า
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
ทำไมการตรวจสอบ R CMD ถึงถูกต้อง
การตรวจสอบถูกต้องทางเทคนิค x.values
และy.values
- ไม่ได้กำหนดไว้ในฟังก์ชัน
JitteredResponsesByContrast()
- ไม่ได้กำหนดไว้ล่วงหน้าในแบบฟอร์ม
x.values <- [something]
ทั้งแบบโกลบอลหรือในผู้โทร
แต่พวกเขากำลังตัวแปรภายใน dataframe JitteredResponsesByContrast()
ที่ได้รับการกำหนดไว้ก่อนหน้านี้และผ่านเข้าสู่ฟังก์ชั่น
ทำไม ggplot2 ทำให้ยากต่อการเอาใจเช็ค R CMD
ggplot2 ดูเหมือนว่าจะสนับสนุนการใช้data
อาร์กิวเมนต์ อาร์กิวเมนต์ data สันนิษฐานว่าเป็นสาเหตุที่รหัสนี้จะทำงาน
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
แต่รหัสนี้จะสร้างข้อผิดพลาดที่ไม่พบวัตถุ:
library(ggplot2)
hwy # a variable in the mpg dataset
สองรอบการทำงานและทำไมฉันมีความสุขกับทั้ง
กลยุทธ์ที่เป็นโมฆะ
Matthew Dowle แนะนำให้ตั้งค่าตัวแปรที่มีปัญหาเป็น NULL ก่อนซึ่งในกรณีของฉันจะเป็นดังนี้:
JitteredResponsesByContrast <- function (data) {
x.values <- y.values <- NULL # Setting the variables to NULL first
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
ฉันขอขอบคุณวิธีแก้ปัญหานี้ แต่ฉันไม่ชอบด้วยเหตุผลสามประการ
R CMD check
มันจะทำหน้าที่ไม่มีวัตถุประสงค์เพิ่มเติมนอกเหนือสยบ- มันไม่สะท้อนความตั้งใจ มันเพิ่มความคาดหวังว่าการ
aes()
โทรจะเห็นตัวแปร now-NULL ของเรา (จะไม่) ในขณะที่ปิดบังวัตถุประสงค์ที่แท้จริง (ทำให้ R CMD ตรวจสอบการรับรู้ถึงตัวแปรที่เห็นได้ชัดว่าไม่ทราบว่าถูกผูกไว้) - ปัญหาของ 1 และ 2 ทวีคูณเพราะทุกครั้งที่คุณเขียนฟังก์ชั่นที่ส่งคืนองค์ประกอบพล็อตคุณต้องเพิ่มคำสั่ง NULLing ที่สับสน
กลยุทธ์ with ()
คุณสามารถใช้with()
เพื่อส่งสัญญาณอย่างชัดเจนว่าตัวแปรที่เป็นปัญหาสามารถพบได้ในสภาพแวดล้อมที่มีขนาดใหญ่ขึ้น ในกรณีของฉันการใช้with()
มีลักษณะดังนี้:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
วิธีนี้ใช้ได้ผล แต่ฉันไม่ชอบวิธีนี้เพราะไม่ได้ผลอย่างที่คาดไว้ หากwith()
เป็นการแก้ปัญหาอย่างแท้จริงในการชี้ล่ามไปยังจุดที่ตัวแปรนั้นอยู่ฉันก็ไม่จำเป็นต้องมีdata =
ข้อโต้แย้ง แต่ใช้with()
ไม่ได้ผล:
library(ggplot2)
p <- ggplot()
p <- p + with(mpg, geom_point(aes(x = hwy, y = cty)))
p # will generate an error saying `hwy` is not found
ดังนั้นอีกครั้งฉันคิดว่าวิธีนี้มีข้อบกพร่องคล้ายกับกลยุทธ์ NULLing:
- ฉันยังต้องผ่านทุกฟังก์ชั่นองค์ประกอบการพล็อตและห่อตรรกะในการ
with()
โทร - การ
with()
โทรทำให้เข้าใจผิด ฉันยังต้องระบุdata =
เหตุผล ทั้งหมดจะทำคือสยบwith()
R CMD check
ข้อสรุป
วิธีที่ฉันเห็นมันมีสามตัวเลือกที่ฉันสามารถทำได้:
- Lobby CRAN เพื่อเพิกเฉยต่อบันทึกย่อโดยอ้างว่าพวกเขา "ปลอมแปลง" (ตามนโยบาย CRAN ) และทำเช่นนั้นทุกครั้งที่ฉันส่งแพคเกจ
- แก้ไขรหัสของฉันด้วยหนึ่งในสองกลยุทธ์ที่ไม่พึงประสงค์ (NULLing หรือ
with()
บล็อก) - ครวญครางดังมากและหวังว่าปัญหาจะหายไป
ไม่มีสามคนที่ทำให้ฉันมีความสุขและฉันสงสัยว่าผู้คนแนะนำฉันอย่างไร (และผู้พัฒนาแพ็คเกจอื่น ๆ ที่ต้องการแตะ ggplot2) ควรทำ ขอบคุณทุกคนล่วงหน้า ฉันขอขอบคุณที่คุณอ่านข้อความนี้ :-)
aes_string
transform
และsubset
เกินไป (ไม่แน่ใจ 100% แต่มันสมเหตุสมผล)