2014-07-03 49 views
1

所以我創建了一個環境(我試圖用它作爲散列表)。R向量化環境訪問

爲了澄清我訪問存儲在環境與此值:

hash[["uniqueIDString"]] ## hash takes a uniqueID and returns a 
          ## dataframe subset that is precomputed 

我也有一個函數調用FUNC返回由哈希返回的行的某個子集。它對單個調用很好,但它不是矢量化的,所以我不能在一個非常重要的轉換中使用它。

下不起作用:

df <- transform(df,FOO = func(hash[[ID]])$FOO) 

它給了我一個錯誤關於具有錯誤的參數數目爲亂碼,我推測是因爲它傳遞ID的載體,我的環境和環境不知道該怎麼做。

編輯:確切的錯誤是:

Error in hash[[ID]] : 
     wrong arguments for subsetting an environment 

編輯:隨着Rob的建議,我收到以下錯誤:

Error in hash[ID] : 
     object of type 'environment' is not subsettable 

編輯:爲了澄清我試圖在轉換的上下文中使用哈希查找,其中ID列中的值在哈希表中查找並傳遞給func o輸出可以成爲新的列。

+0

您使用的是單指數'[ ['運算符在非長度爲1的矢量'df $ ID'上。 –

+0

@RobertKrzyzanowski做出改變,現在錯誤指出'environment'類型的對象不是子集。想法? –

+0

我認爲更一般,仍然怪異的行爲是:「f = function(x){hash [[x]]}; apply(vector,2,f)」產生「散列錯誤[[x]]:子集化環境的錯誤參數「,即使hash [[x]]在不在apply中時返回你想要的內容。 –

回答

2

我使用環境作爲哈希表很多,順便到對應於多個鍵是使用檢索值mget

hash <- new.env() 
hash[['one']] <- 'this is one' 
hash[['two']] <- 'this is two' 
mget(c('one', 'two'), envir = hash) 

如果需要輸出它返回一個列表

$one 
[1] "this is one" 

$two 
[1] "this is two" 

作爲一個載體,使用unlist

unlist(mget(c('one', 'two'), envir = hash)) 

gi VES你

  one   two 
"this is one" "this is two" 

UPDATE如果你的ID來自數據幀時,你需要使用unlist到列轉換爲向量:

df <- data.frame(id=c('one', 'two')) 
unlist(mget(unlist(df$id), envir = hash)) 
+0

用'mget(ID,envir = hash)'替換'hash [[ID]]'? –

+0

(刪除以前的評論,因爲我誤解了你的答案)這與我想要做的類似,但是當我嘗試調用帶有列字段名稱的mget時,它給了我一個無效的參數錯誤。 –

+0

@RobertKrzyzanowski是的,如果問題中提到的'func'必須有一個向量,則使用'unlist'。 –