2013-05-10 146 views
-1

考慮這個名單:如何根據函數中的名稱選擇列表元素?

l <- list(a=1:10,b=1:10,c=rep(0,10),d=11:20) 

然後考慮這個示例代碼(代表真正的更大的代碼的)。 它只是根據名稱選擇列表中的正確元素。

參數:

對象:與列表在最大四個元素(即,有時少於四個)。元素總是被稱爲a,b,c和d,但並不總是以相同的順序出現在列表中。

X:元件的名稱來選擇(即,A,B,c或d)

slct <- function(object,x) { 
    if (x=="a") { 
    object$a 
    } else if (x=="b") { 
    object$b 
    } else if (x=="c") { 
    object$c 
    } else if (x=="d") { 
    object$d 
    } 
} 

slct(l,"d") 

當你有不是一個單純的4個元素,但是數百這種做法變得根本不切實際。 此外,我不能根據數字(例如,object [[1]])進行選擇,因爲每次元素不會以相同的順序來到 。那麼我怎樣才能縮短上面的代碼呢?

我在想在SAS的宏觀方法,當然,這並不在R.

slct <- function(object,x) { 

    object$x 
} 
object$a 

slct(object=l,x="a") 

什麼我必須更換對象$ x其中,使其工作工作,但用更少的代碼比在上面的代碼?

+1

見'運氣(312)'。 – 2013-05-10 19:17:37

回答

7

只需使用雙括號引用列表中的元素。

l[['a']] 
l[['b']] 
etc... 

或者,您可以使用正則表達式來構建函數!

select <- function(object, x) { 
    index <- grep(x, names(object)) 
    return(object[[index]]) 
} 

希望這有助於!


這裏甚至不需要grep。上面的功能將導致一個錯誤,如果試圖例如:select(l, "f")其中作爲修改函數以這種方式會簡單地返回一個NULL您可以與is.null(.)檢查:

select <- function(object, x) { 
    return(object[[x]]) 
} 
select(l, "a") 
# [1] 1 2 3 4 5 6 7 8 9 10 
select(l, "f") 
# NULL 
+1

這裏你不需要'grep'。 – Arun 2013-05-10 18:05:32

+0

很酷,謝謝@Arun! – Andreas 2013-05-10 18:38:13

+0

謝謝你解決我的問題! – user1134616 2013-05-10 18:46:40

相關問題