web-dev-qa-db-ja.com

R:複数行のggplot2コマンドからの「単項演算子エラー」

下に示す3番目の列に示すように、ggplot2を使用して2つの異なる種の箱ひげ図比較を行っています。

> library(reshape2)
> library(ggplot2)
> melt.data = melt(actb.raw.data)

> head(actb.raw.data)
  region  expression species
1     CG -0.17686667   human
2     CG -0.06506667   human
3     DG  1.04590000   human
4    CA1  1.94093333   human
5    CA2  1.55023333   human
6    CA3  1.75800000   human

> head(melt.data)
  region species   variable       value
1     CG   human expression -0.17686667
2     CG   human expression -0.06506667
3     DG   human expression  1.04590000
4    CA1   human expression  1.94093333
5    CA2   human expression  1.55023333
6    CA3   human expression  1.75800000

ただし、次のコードを実行すると:

ggplot(combined.data, aes(x = region, y = expression, fill = species)) +
+     geom_boxplot() +
+     scale_fill_manual(values = c("yellow", "orange"))
+     ggtitle("Expression comparisons for ACTB")
+     theme(axis.text.x = element_text(angle=90, face="bold", colour="black"))

私はこのエラーを受け取ります:

> ggplot(actb.raw.data, aes(x = region, y = expression, fill = species)) +
+     + geom_boxplot() +
+     + scale_fill_manual(values = c("yellow", "orange"))
Error in +geom_boxplot() : invalid argument to unary operator
> + ggtitle("ACTB expression in human vs. macaque")
Error in +ggtitle("ACTB expression in human vs. macaque") : 
 invalid argument to unary operator
> + theme(axis.text.x = element_text(angle=90, face="bold", colour="black"))
Error in inherits(x, "theme") : argument "e2" is missing, with no default

これは、価値があるものは何でも、変数melt.dataを使用して実行した場合にも発生します。誰かがこれを修正するのを手伝ってもらえますか?以前に同じ形式でフォーマットされた別のデータセットを使用してこのコードを正常に実行しましたが、ここで何が間違っているのかわかりません。

35
soosus

余分な+を各行の先頭に挿入したように見えますが、Rは単項演算子として解釈しています(減算ではなく、否定として解釈される-など)。うまくいくと思う

ggplot(combined.data, aes(x = region, y = expression, fill = species)) +
    geom_boxplot() +
    scale_fill_manual(values = c("yellow", "orange")) + 
    ggtitle("Expression comparisons for ACTB") + 
    theme(axis.text.x = element_text(angle=90, face="bold", colour="black"))

おそらく、Rコンソールの出力からコピーして貼り付けますか?入力が不完全な場合、コンソールは行の先頭で+を使用します。

70

これは、 Rに複数行コマンドをポストする の場合によく知られている迷惑です。 (複数行とコメントの両方で、行をコピーアンドペーストするときにスクリプトをsource()するとき、異なる動作を得ることができます)

Rule:常に行のendにぶら下がっている '+'を置くので、Rはコマンドが未完了であることを認識します:

_ggplot(...) + geom_whatever1(...) +
  geom_whatever2(...) +
  stat_whatever3(...) +
  geom_title(...) + scale_y_log10(...)
_

行の先頭にぶら下がっている「+」を置かないでください。これはこのError in "+ geom_whatever2(...) invalid argument to unary operator"をくすぐるからです。

そして、構文エラーであるため、ぶら下がり「+」を両端と先頭に置かないでください。そのため、一貫性を保つ習慣を身につけましょう。常に行末に「+」を付けます。

cf. 「Rスクリプトの複数行にわたるコードの分割」への回答

20
smci

行の先頭にある「+」演算子です(2つの「+」演算子を連続して使用しているだけではありません)。 「+」演算子は行の終わりで使用できますが、先頭では使用できません。

これは動作します:

ggplot(combined.data, aes(x = region, y = expression, fill = species)) +
geom_boxplot() 

しない:

ggplot(combined.data, aes(x = region, y = expression, fill = species))
+ geom_boxplot() 

*Error in + geom_boxplot():
invalid argument to unary operator*

また、2つの「+」演算子を使用することもできません。この場合、これは実行済みです。ただし、これを修正するには、行の先頭にあるものを選択的に削除する必要があります。

4
jidulberger