2010-04-10 34 views
9

Giả sử rằng tôi có một khung dữ liệu với một cột có tên được lưu trữ trong một biến. Truy cập vào cột này bằng cách sử dụng biến được dễ dàng sử dụng ký hiệu khung:Truy cập các cột tùy ý từ một khung dữ liệu R sử dụng với()

df <- data.frame(A = rep(1, 10), B = rep(2, 10)) 
column.name <- 'B' 

df[,column.name] 

Nhưng nó không phải là rõ ràng làm thế nào để truy cập vào một cột tùy ý sử dụng một cuộc gọi đến with(). Cách tiếp cận ngây thơ

with(df, column.name) 

đánh giá hiệu quả column.name trong môi trường của người gọi. Làm thế nào tôi có thể trì hoãn việc đánh giá đầy đủ rằng with() sẽ cung cấp cùng một kết quả mà các dấu ngoặc cung cấp?

Trả lời

17

Bạn có thể sử dụng get:

with(df, get(column.name)) 
1

Bạn sử dụng 'bằng' để tạo không gian tên được bản địa hóa và tạm thời bên trong mà bạn đánh giá một số biểu thức. Trong mã của bạn ở trên, bạn đã không được thông qua trong một biểu thức.

Ví dụ:

data(iris) # this data is in your R installation, just call 'data' and pass it in 

Thông thường bạn phải tham khảo tên biến trong một khung dữ liệu như thế này:

tx = tapply(iris$sepal.len, list(iris$species), mean) 

Trừ khi bạn làm điều này:

attach(iris) 

vấn đề

Các với việc sử dụng 'attach' là khả năng xung đột không gian tên, vì vậy bạn phải nhớ gọi 'tách'

Đó là sạch hơn nhiều để sử dụng 'với':

tx = with(iris, tapply(sepal.len, list(species), mean)) 

Vì vậy, chữ ký cuộc gọi (không chính thức) là: với (dữ liệu, chức năng())

+1

Đó là một bản tóm tắt tốt về 'with()', nhưng tôi muốn biết cách buộc giá trị của 'column.name' trở thành biểu thức mong muốn. – johnmyleswhite

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