[R] get element of list with default?
Marc Schwartz
marc_schwartz at me.com
Tue Apr 15 18:30:07 CEST 2014
On Apr 15, 2014, at 11:22 AM, Marc Schwartz <marc_schwartz at me.com> wrote:
> On Apr 15, 2014, at 10:53 AM, Spencer Graves <spencer.graves at structuremonitoring.com> wrote:
>
>> Hello:
>>
>>
>> Do you know of a simple function to return the value of a named element of a list if that exists, and return a default value otherwise?
>>
>>
>> It's an easy function to write (e.g., below). I plan to add this to the "Ecfun" package unless I find it in another CRAN package.
>>
>>
>> Thanks,
>> Spencer
>>
>>
>> getElement <- function(element, default, list){
>> # get element of list; return elDefault if absent
>> El <- list[[element]]
>> if(is.null(El)){
>> El <- default
>> }
>> El
>> }
>
>
> Hi Spencer,
>
> I don't know of a function elsewhere, but you can probably simplify the above with:
>
> getElement <- function(element, default, list) {
> ifelse(is.null(list[[element]]), default, list[[element]])
> }
>
>
> MyList <- list(L1 = 1, L2 = 2)
>
>> MyList
> $L1
> [1] 1
>
> $L2
> [1] 2
>
>
>
>> getElement("L1", 5, MyList)
> [1] 1
>
>> getElement("L2", 5, MyList)
> [1] 2
>
>> getElement("L3", 5, MyList)
> [1] 5
>
>
> You might want to think about the ordering of the function arguments, given typical use, for ease of calling it. For example:
>
> getElement <- function(list, element, default = SomeValue)
>
> Another consideration is that the above function will only get the element if it is a 'first level' element in the list. If it is in a sub-list of the main list, you would need to think about a recursive approach of some type, along the lines of what ?rapply does.
>
> Regards,
>
> Marc Schwartz
Spencer,
A quick heads up here. I forgot, that there is already a function called getElement() in base R which appears to be designed to handle S4 objects and slots, lacking the default return value however, where it returns NULL if the 'name' element is not present:
> getElement
function (object, name)
{
if (isS4(object))
slot(object, name)
else object[[name, exact = TRUE]]
}
<bytecode: 0x100905870>
<environment: namespace:base>
Thus, I would suggest calling your variant something else, or wrap the default function in your version, if you need/want to handle S4 objects and slots.
Regards,
Marc
More information about the R-help
mailing list