1

R には、名前付き要素と名前なし要素の両方を含むリストがあります。リスト全体を反復処理し、名前のない要素の要素のみを取得する関数を適用し、名前付き要素の名前と添付要素の両方に別の関数を適用したいと考えています。

疑似コードでは、関数は次のようif(named) f(name, list[[name]]) else g(element)になります。ここで、list[[name]]はその名前で格納された要素です。

たとえば、リスト要素に名前がない場合、その要素が返されます。リスト要素に名前が付けられている場合は、要素と同じ回数繰り返される名前を返したいと思います (要素が整数であると仮定します)。

私が持っていたll = list(a = 5, b = 3, 9, 18)場合、関数は要素を含むリストを返す必要があります

[[1]]
[1] "aaaaa"

[[2]]
[1] "bbb"

[[3]]
[1] 9

[[4]]
[1] 18

反復することを考えましnames(ll)たが、これは名前のない要素にアクセスできません。names[[3]]とはnames[[4]]と に等しく""なりll[[""]] = NULLます。

プロセスは非常に効率的である必要はないので、使用できます

for(i in 1:length(names(ll)))
  if(names(ll)[[i]] == "")
    g(ll[[i]])
  else
    f(names(ll)[[i]], ll[[names(ll)[[i]])

しかし、私はよりきちんとした解決策を探していました。

4

2 に答える 2

1

あなたは小さな名前付き関数を作ることができます

named<-function(x) names(x)!=''

そしてそれをあなたのリストで使用してください:

ll <- list(a = 5, b = 3, 9, 18)
ll[named(ll)]
# $a
# [1] 5
# 
# $b
# [1] 3

または他の方法:

ll[!named(ll)]
# [[1]]
# [1] 9
# 
# [[2]]
# [1] 18 

ただし、リストに名前がまったくない場合、これは失敗するため、namedその場合を処理するように変更できます。

named<-function(x) if (is.null(names(x))) rep(FALSE,length(x)) else names(x)!=''
于 2013-06-12T16:20:03.773 に答える