คุณไม่สามารถทำการย่อยแบบนั้นด้วย$
. ในซอร์สโค้ด ( R/src/main/subset.c
) ระบุว่า:
/ * ตัวดำเนินการ $ ส่วนย่อย
เราต้องแน่ใจว่าได้ประเมินเฉพาะอาร์กิวเมนต์แรกเท่านั้น
อันที่สองจะเป็นสัญลักษณ์ที่ต้องจับคู่ไม่ได้รับการประเมิน
* /
ข้อโต้แย้งที่สอง? อะไร?! คุณต้องตระหนักว่า$
เหมือนทุกสิ่งทุกอย่างใน R (รวมถึงตัวอย่างเช่น(
, +
, ^
ฯลฯ ) เป็นฟังก์ชั่นที่เกิดการขัดแย้งและการประเมิน df$V1
สามารถเขียนใหม่เป็น
`$`(df , V1)
หรือแน่นอน
`$`(df , "V1")
แต่...
`$`(df , paste0("V1") )
... ตัวอย่างเช่นจะไม่ได้ผลหรือสิ่งอื่นใดที่ต้องได้รับการประเมินก่อนในอาร์กิวเมนต์ที่สอง คุณสามารถส่งผ่านสตริงที่ไม่ได้รับการประเมินเท่านั้น
ให้ใช้แทน[
(หรือ[[
ถ้าคุณต้องการแยกเฉพาะคอลัมน์เดียวเป็นเวกเตอร์)
ตัวอย่างเช่น,
var <- "mpg"
#Doesn't work
mtcars$var
#These both work, but note that what they return is different
# the first is a vector, the second is a data.frame
mtcars[[var]]
mtcars[var]
คุณสามารถดำเนินการสั่งซื้อโดยไม่ต้องวนซ้ำโดยใช้do.call
เพื่อสร้างการโทรไปที่ order
นี่คือตัวอย่างที่ทำซ้ำได้ด้านล่าง:
# set seed for reproducibility
set.seed(123)
df <- data.frame( col1 = sample(5,10,repl=T) , col2 = sample(5,10,repl=T) , col3 = sample(5,10,repl=T) )
# We want to sort by 'col3' then by 'col1'
sort_list <- c("col3","col1")
# Use 'do.call' to call order. Seccond argument in do.call is a list of arguments
# to pass to the first argument, in this case 'order'.
# Since a data.frame is really a list, we just subset the data.frame
# according to the columns we want to sort in, in that order
df[ do.call( order , df[ , match( sort_list , names(df) ) ] ) , ]
col1 col2 col3
10 3 5 1
9 3 2 2
7 3 2 3
8 5 1 3
6 1 5 4
3 3 4 4
2 4 3 4
5 5 1 4
1 2 5 5
4 5 3 5