2010-09-04 42 views
5

Tôi tạo ra một chức năng để xử lý một số dữ liệu của tôi, như thế này:biến toàn cầu trong chức năng R

a <- "old" 
test <- function (x) { 
    assign(x, "new", envir = .GlobalEnv) 
} 
test(a) 

Nhưng tôi không thể nhìn thấy một sự thay đổi từ "cũ" thành "mới", tôi đoán đây là một số "biến toàn cầu", bất kỳ đề xuất nào?

Cảm ơn!

+4

Trước hết, đừng làm điều đó - rối tung trong môi trường toàn cầu với các chức năng hầu như luôn là một ý tưởng tồi dẫn đến việc ghi đè ngẫu nhiên, khó theo dõi lỗi và hỗn loạn tổng thể. – mbq

Trả lời

7

cho assign(x,value), x cần phải là một tên của một biến không giá trị của nó, vì vậy x nên ở dạng ký tự: assign("a","new"), và để được sử dụng trong chức năng của bạn , hãy thử:

test <- function (x) 
{ 
    assign(deparse(substitute(x)), "new", envir = .GlobalEnv) 
} 

trong trường hợp của bạn, bạn sẽ tạo một biến có tên là "cũ" và gán "mới" với nó:

> old 
[1] "new" 
+1

hoặc chỉ là một 'thử nghiệm (" a ")' với mã gốc. – Marek

2

bạn có thể kết hợp chức năng của bạn với sapply chức năng, ví dụ:

require (plyr) 
b <- sapply (a, test) 
b 
    old 
"new" 

cách mà bạn đang áp dụng chức năng của bạn đến các yếu tố thực tế của a vector của bạn - như romunov chỉ ra trong câu trả lời của mình.

khác ví dụ:

a <- c("old", "oold", "ooold", "oooold") 
b <- sapply (a, test) 
b 
    old oold ooold oooold 
"new" "new" "new" "new" 
+1

cái nào là hàm plyr? – hatmatrix

+0

@Stephen: oh yeah, right. 'sapply' là từ gói cơ sở - sửa chữa điều đó. hàm plyr luôn được đặt tên với một 'p'. – mropa