2017-08-07 19 views
0
次のコードは、期待どおりに動作

命名:purrr ::ユーザー定義関数でPMAPとリスト

library(tidyverse) 
tib <- tibble(x = c(1,2), y = c(2,4), z = c(3,6)) 
tib %>% pmap(c) 
#[[1]] 
#x y z 
#1 2 3 
# 
#[[2]] 
#x y z 
#2 4 6 

をしかし、私は関数を定義する場合

my_c_1 <- function(u, v, w) c(u, v, w) 

私はエラーを取得する:

tib %>% pmap(my_c_1) 
#Error in .f(x = .l[[c(1L, i)]], y = .l[[c(2L, i)]], z = .l[[c(3L, i)]], : 
# unused arguments (x = .l[[c(1, i)]], y = .l[[c(2, i)]], z = .l[[c(3, i)]]) 

同様に、基底関数を持つ名前付きリストの場合、すべて正常に機能します。

lili_1 <- list(x = list(1,2), y = list(2,4), z = list(3,6)) 
pmap(lili_1, c) 
#[[1]] 
#x y z 
#1 2 3 
# 
#[[2]] 
#x y z 
#2 4 6 

とユーザ定義関数と私は同じエラーを取得:

pmap(lili_1, my_c_1) 
#Error in .f(x = .l[[c(1L, i)]], y = .l[[c(2L, i)]], z = .l[[c(3L, i)]], : 
#unused arguments (x = .l[[c(1, i)]], y = .l[[c(2, i)]], z = .l[[c(3, i)]]) 

ただし、ユーザー定義関数と非命名リストについては、それが動作:

lili_2 <- list(list(1,2), list(2,4), list(3,6)) 
pmap(lili_2, my_c_1) 
#[[1]] 
#[1] 1 2 3 
# 
#[[2]] 
#[1] 2 4 6 

名前付きリストとユーザー定義関数で何が壊れているのかよくわかりません。どんな洞察?

ところで、私が定義することで、一時的な回避策が見つかりました:

my_c_2 <- function(...) c(...) 

をその後、すべては私にさらに困惑出る...でも、名前のリストで、うまく動作します。
これは最小の再現可能な例を念頭に置いています。私の現在の作業コードでは、変数に...の回避策を使用せずに、より一般的な定義された関数を使ってtibblesをpmapにパイプすることができます。

+0

私はRバージョン3.4.1をpurrr_0.2.3で使用しています(macOS Sierra 10.12.6)。 – Habert

答えて

0

あなたの関数my_c_1は引数uvwを持っていますが、名前xyzのリストを渡します。名前付き引数を持たない関数(...、たとえば基底のcなど)を望んでいない場合は、呼び出し中の名前が一致するようにする必要があります。

+0

ありがとう!実際に 'my_c_1 < - function(x、y、z)c(x、y、z)'を定義すると動作しますが、それはむしろ不便です。私は、必ずしも 'x'、' y'、 'z'という名前ではないカラムを持つpmapと多くの異なるtibbleでその関数を使いたいかもしれません。関数の定義における変数の名前は、入力の名前とは無関係であるべきではありません。たとえばmap2(lili_1 [1]、lili_1 [[2]]、my_c_3) 'はmy_c_3 < - function(u、v)c(u、v)'で動作します。 – Habert

+0

'lili_1 [[1]]'は名前を持たないのでmap2と "動作"します。この場合、名前は位置一致となります。 Rの名前付き呼び出しパラメータは、関数呼び出しの名前付き引数と一致しなければならないという一般的な特徴と規則です。位置の一致のみに依存したい場合は、それらの名前を削除するか、名前付き引数を持たない関数を持たなければなりません。 – baptiste

+0

説明をありがとう! 'pmap(unname(lili_1)、my_c_1)'はうまく動作します。それは満足のいく解決策です。 – Habert

関連する問題