2011-07-16 4 views
6

Tiêu đề là câu hỏi khép kín. Một ví dụ rõ: Xem xétChỉ định thuộc tính danh sách trong môi trường

x=list(a=1, b="name") 
f <- function(){ 
    assign('y[["d"]]', FALSE, parent.frame()) 
} 
g <- function(y) {f(); print(y)} 

g(x) 

$a 
[1] 1 

$b 
[1] "name" 

trong khi tôi muốn có được

g(x) 

$a 
[1] 1 

$b 
[1] "name" 

$d 
[1] FALSE 

Một vài nhận xét. Tôi biết những gì là sai trong ví dụ ban đầu của tôi, nhưng đang sử dụng nó để làm rõ mục tiêu của tôi. Tôi muốn tránh < < - và muốn x được thay đổi trong khung chính.

Tôi nghĩ rằng sự hiểu biết của mình về môi trường là nguyên thủy và mọi tham chiếu đều được đánh giá cao.

+0

Bạn đang cố gắng để làm gì? Sửa đổi biến ngoài – hadley

+0

Tôi đang cố gắng tránh đi qua giá trị một đối tượng rất lớn với một hàm được gọi nhiều lần, hàm này cũng sửa đổi một phần của đối tượng. đôi khi hữu ích – gappy

+0

Bạn đã định hình đi qua vật thể và phát hiện ra rằng đó là vấn đề? R sẽ không sao chép obj ect trừ khi bạn sửa đổi nó, mà bạn đang làm ở đây anyway. Nó không phải là rõ ràng rằng cách tiếp cận phức tạp hơn này thực sự sẽ giúp bạn tiết kiệm thời gian. – hadley

Trả lời

6

Đối số đầu tiên cho assign phải là tên biến, không phải là biểu diễn ký tự của biểu thức. Hãy thử thay thế f với:

f <- function() with(parent.frame(), y$d <- FALSE) 

Lưu ý rằng a, bd là những thành phần danh sách, không danh sách các thuộc tính. Nếu chúng ta muốn thêm một thuộc tính "d" để y trong khung mẹ f 's chúng tôi sẽ làm điều này:

f <- function() with(parent.frame(), attr(y, "d") <- FALSE) 

Ngoài ra, lưu ý rằng tùy thuộc vào những gì bạn muốn làm điều đó có thể (hoặc không thể) được tốt hơn để có x là môi trường hoặc đối tượng proto (từ gói proto).

3

assign Đối số đầu tiên của cần phải là tên đối tượng. Việc bạn sử dụng số assign về cơ bản giống với ví dụ về số lượt truy cập ở cuối trang trợ giúp chỉ định. Quan sát:

> x=list(a=1, b="name") 
> f <- function(){ 
+  assign('x["d"]', FALSE, parent.frame()) 
+ } 
> g <- function(y) {f(); print(`x["d"]`)} 
> g(x) 
[1] FALSE # a variable with the name `x["d"]` was created 

Đây có thể là nơi bạn muốn sử dụng "< < -" nhưng nó thường được coi nghi ngờ.

> f <- function(){ 
+  x$d <<- FALSE 
+ } 
> g <- function(y) {f(); print(y)} 
> g(x) 
$a 
[1] 1 

$b 
[1] "name" 

$d 
[1] FALSE 

Một ý nghĩ xa hơn, được cung cấp trong sự vắng mặt của bất kỳ mục tiêu cho bài tập này và bỏ qua thuật ngữ "thuộc tính" mà Gabor đã chỉ ra có một ý nghĩa đặc biệt trong R, nhưng có thể không có được mục tiêu của bạn. Nếu tất cả các bạn muốn là đầu ra để phù hợp với thông số kỹ thuật của bạn thì điều này đạt được mục tiêu đó nhưng lưu ý rằng không có sự thay đổi của x trong môi trường toàn cầu đang xảy ra.

> f <- function(){ 
+  assign('y', c(x, d=FALSE), parent.frame()) 
+ } 
> g <- function(y) {f(); print(y)} 
> g(x) 
$a 
[1] 1 

$b 
[1] "name" 

$d 
[1] FALSE 

> x # `x` is unchanged 
$a 
[1] 1 

$b 
[1] "name" 

Các parent.frame cho f là những gì có thể được gọi là "nội thất của g nhưng thay đổi không truyền ra đối với môi trường toàn cầu.

+0

Nó không phải là << - nghi ngờ - đó là bất kỳ nhiệm vụ nào bên ngoài môi trường địa phương. – hadley