2015-12-02 24 views
5

Tôi đã bị bối rối bởi điều này một vài lần rồi, vì vậy đây là câu hỏi đã được thực hiện cho những người khác có thể vấp ngã cùng một vấn đề.thay thế phần tử trong vector đơn vị lưới

xem xét vector đơn vị lưới này,

a = unit(1:3, c("cm", "in", "npc")) 

Tôi muốn thay thế một số yếu tố với các giá trị mới. Cách tiếp cận tự nhiên sẽ là,

a[1] = unit(2,"pt") 
a 
# [1] 2cm 2in 3npc 

Đã xảy ra sự cố: chỉ giá trị số được thay đổi chứ không phải đơn vị. Tại sao? Phải làm gì?

Chỉnh sửa: Như được chỉ ra trong một câu trả lời bên dưới, các đơn vị như vậy chỉ là các vectơ số với các thuộc tính. Tuy nhiên, offsprings của họ unit.arithmeticunit.list cũng nên được coi là giải pháp hoàn toàn chung (ví dụ: sử dụng trong điều chỉnh kích thước bảng điều khiển của các đối tượng ggplot). Xem xét vectơ đơn vị này,

(b = a + unit(1, "npc")) 
# [1] 1cm+1npc 2in+1npc 3npc+1npc 
# [1] "unit.arithmetic" "unit" 

Bây giờ thay thế một phần tử cụ thể thì phức tạp hơn, vì chúng không còn nguyên tử nữa.

Trả lời

2

Có vẻ như a chỉ là một vectơ nguyên tử với một số thuộc tính gắn liền với nó. Vì vậy, khi bạn sử dụng a[1] = unit(2,"pt"), hàm unit mới sẽ tạo ra một vector nguyên tử khác có độ dài thay thế giá trị a[1]. Các thuộc tính vẫn bị ảnh hưởng.

Vì vậy, một cái gì đó như thế này dường như được làm việc:

a[1] <- 2 
attr(a, 'unit')[1] <- 'pt' 

> a 
[1] 2pt 2in 3npc 
+0

Tuy nhiên, tôi có cảm giác rằng bạn đã biết điều này. – LyzandeR

+0

Tôi đang ở giữa viết câu trả lời, nhưng bị kẹt tại một thời điểm. Cách tiếp cận của bạn là chính xác, nhưng tôi lo sợ không hoàn toàn chung vì các vectơ đơn vị cũng có thể chứa các phần tử phức tạp hơn, chẳng hạn như unit.arithmetic: 'b = a + unit (1," npc ")'. Tôi sẽ chỉnh sửa câu hỏi. – baptiste

+0

Tôi có thể thấy nơi nó có thể đi sai với 'unit.arithmetics'. Nếu bạn nói rằng phương pháp '[<-' sẽ khó thực hiện thì tôi không có lý do gì để không tin bạn. 'unit.list' có vẻ như là một giải pháp đủ tốt tbh. – LyzandeR

3

Sau một cuộc thảo luận với Paul Murrell (và, amusingly, tái phát minh ra những gì tôi muốn figured out before), vấn đề nằm ở sự vắng mặt của một [<- phương pháp cho các đơn vị lưới. Việc sửa chữa dài hạn sẽ là triển khai các phương thức đó, nhưng nó không tầm thường vì các đơn vị lưới đi kèm với các anh chị em như unit.arithmetic và unit.list, và sự tương tác của chúng có thể trở nên khó hiểu.

Sửa lỗi dễ dàng hơn, hướng người dùng, là chuyển đổi các vectơ đơn vị đó thành các đối tượng unit.list, sẽ kế thừa một phương thức truy cập giống như các danh sách R thông thường. Khuyến mãi này cho đối tượng unit.list có thể được thực hiện với hàm unexported grid:::unit.list().

a = unit(1:3, c("cm", "in", "npc")) 
b = grid:::unit.list(a) 
is.list(b) # check that indeed this is a list object, thanks @Josh O'Brien 
# [1] TRUE 
# so now we can use standard list methods 
b[[1]] = unit(2,"pt") 
b 
#[1] 2pt 2in 3npc 
+0

hãy giải thích cho tôi lý do tại sao '[<-' nguyên thủy bây giờ làm điều đúng: Tôi [không thể tìm thấy một phương thức cho unit.list hoặc: S] (https://github.com/wch/r-source/ blob/b156e3a711967f58131e23c1b1dc1ea90e2f0c43/src/thư viện/lưới/R/đơn vị.R) – baptiste

+0

Nó không cần một phương pháp đặc biệt. Đó chỉ là hành vi mặc định '[<-' khi được áp dụng cho một danh sách (và một' unit.list' là một danh sách). –

+0

nhưng tại sao lại là danh sách? (hoặc làm thế nào để bạn thấy rằng nó là một). Tôi đoán nó là một cái gì đó để làm với is.atomic (?) – baptiste

Các vấn đề liên quan