7

私は R にかなり慣れていないので、%>%演算子と " ." (ドット) プレースホルダーの使用法を理解しようとしています。簡単な例として、次のコードが機能します

library(magrittr)
library(ensurer)
ensure_data.frame <- ensures_that(is.data.frame(.))
data.frame(x = 5) %>% ensure_data.frame

ただし、次のコードは失敗します

ensure_data.frame <- ensures_that(. %>% is.data.frame)
data.frame(x = 5) %>% ensure_data.frame

ここで、プレースホルダーを is.data.frame メソッドにパイプしています。

遅れているのはドットプレースホルダーの制限/解釈の私の理解であると推測していますが、誰でもこれを明確にすることができますか?

4

2 に答える 2

10

「問題」は、 magrittr に無名関数の簡略表記があることです。

. %>% is.data.frame

とほぼ同じです

function(.) is.data.frame(.)

つまり、ドットが (一番左の) 左側にある場合、パイプは特別な動作をします。

いくつかの方法で動作を回避できます。

(.) %>% is.data.frame

. この特定の例では、これは望ましくない動作のように見えるかもしれませんが、通常、このような例では、最初の式をパイプする必要は実際にはありませんis.data.frame(.). %>% is.data.frame

data %>% 
some_action %>% 
lapply(. %>% some_other_action %>% final_action)

よりも明確であると主張することができます

data %>% 
some_action %>%
lapply(function(.) final_action(some_other_action(.)))
于 2016-04-21T07:24:28.943 に答える
0

これが問題です:

. = data.frame(x = 5)
a = data.frame(x = 5)

a %>% is.data.frame
#[1] TRUE
. %>% is.data.frame
#Functional sequence with the following components:
#
# 1. is.data.frame(.)
#
#Use 'functions' to extract the individual functions. 

私にはバグのように見えますが、dplyr専門家が協力することができます.

あなたの式の簡単な回避策は、行うことです.[] %>% is.data.frame

于 2016-04-19T15:50:03.637 に答える