Ví dụ về khi seq_along hoạt động, nhưng seq tạo ra kết quả không mong muốn là gì?


76

Những ví dụ điển hình về thời điểm seq_alongsẽ hoạt động, nhưng seqsẽ tạo ra kết quả không mong muốn là gì?

Từ tài liệu của ?seqchúng tôi có:

Lưu ý rằng nó gửi trên lớp của đối số đầu tiên bất kể tên đối số. Điều này có thể gây ra những hậu quả không mong muốn nếu nó được gọi chỉ với một lập luận có ý định coi điều này là along.with: tốt hơn là sử dụng seq_alongtrong trường hợp đó.

Câu trả lời:


120

Điều này sẽ làm cho sự khác biệt rõ ràng. Về cơ bản, seq()hoạt động giống như seq_along() ngoại trừ khi truyền một vectơ có độ dài 1, trong trường hợp đó, nó hoạt động như thế nào seq_len(). Nếu thứ này từng cắn bạn, bạn sẽ không bao giờ sử dụng seq()lại!

a <- c(8, 9, 10)
b <- c(9, 10)
c <- 10

seq_along(a)
# [1] 1 2 3
seq_along(b)
# [1] 1 2
seq_along(c)
# [1] 1

seq(a)
# [1] 1 2 3
seq(b)
# [1] 1 2
seq(c)
# [1]  1  2  3  4  5  6  7  8  9 10

Có lẽ điều đáng chú ý là sample()thể hiện hành vi tàn nhẫn tương tự:

sample(a)
# [1] 10  8  9
sample(b)
# [1]  9 10
sample(c)
# [1]  8  7  9  3  4  1  6 10  2  5

là có một thay thế cho sample()sau đó hoặc chỉ sử dụng as.numeric(sample(as.character(c)))?
user1317221_G

6
@ user1317221_G - Tôi vừa mới sử dụng loại ý tưởng: safeSample <- function(x) if(length(x) == 1) x else sample(x). (Hãy dùng thử với safeSample(4:5); safeSample(5).)
Josh O'Brien

Thở dài Đó là khoảnh khắc đáng buồn khi một người dùng đã đăng tất cả các câu trả lời mà bạn đang tìm kiếm và bạn cần đợi 2 ngày để upvote vì sợ tập lệnh upvote nối tiếp :(
Bhargav Rao

@BhargavRao Haha. Cảm ơn vì lời khen;)
Josh O'Brien

Khi được áp dụng cho một vectơ trống x <- c(), seq(x)seq_along(x)cả hai đều trả vềinteger(0)
Enrique Pérez Herrero

26

Nếu đầu vào cho seq có độ dài 1 thì đầu ra giữa seqseq_alongsẽ khác nhau

x <- 5
for(i in seq(x)){
    print(x[i])
}
#[1] 5
#[1] NA
#[1] NA
#[1] NA
#[1] NA

for(i in seq_along(x)){
    print(x[i])
}
#[1] 5

Chúng tôi cũng thấy sự khác biệt nếu đầu vào là vectơ của Ngày

x <- Sys.Date() + 1:5
seq(x)
#Error in seq.Date(x) : 'from' must be of length 1
seq_along(x)
#[1] 1 2 3 4 5

6
ví dụ ngày đó là tuyệt vời!
Ricardo Saporta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.