理解R代码的逻辑

Dat*_*ob7 2 r

我正在通过教程学习R,但是我在"如何阅读"R代码方面遇到了困难,这反过来使得编写R代码变得困难.例如:

dir.create(file.path("testdir2","testdir3"), recursive = TRUE)
Run Code Online (Sandbox Code Playgroud)

VS

dup.names <- as.character(data.combined[which(duplicated(as.character(data.combined$name))), "name"])
Run Code Online (Sandbox Code Playgroud)

虽然我知道这些代码行是做什么的,但我无法读取或解释每行代码的逻辑.我是从左到右还是从右到左阅读.读/写R代码时我应该使用哪些策略?

Eva*_*and 5

dup.names <- as.character(data.combined[which(duplicated(as.character(data.combined$name))), "name"])

不要让像这样的代码行破坏你的R代码

我在这里说实话.代码很糟糕.并且有很多原因.很多人都不能读这样的一行,直观地知道输出是什么.关键是你不应该编写你不理解的代码行.这不是Excel,你没有1条单行来适应所有内容.你有一个美味的大脚本,一个空的画布.使用该空间将您的代码分解成更小的位,从而制作出美丽的马赛克艺术作品!我们潜入〜

解析代码:数据框架

阅读一行代码就像看着熟悉的功能一样.你可以从左到右,从中到外阅读,只要你能锁定熟悉的东西.

好的,你看data.combined.你知道(希望)它有行和列......因为它是数据!

$在代码中发现了一个,并且您知道它必须是data.frame.这是因为只有列表和data.frames(实际上只是列表)允许您使用$列名称对列进行子集化.子集 - 顺便说一句 - 只是意味着看整体的一部分.在R中,data.frames和matrices的子集可以使用单个括号来完成[,您将在其中看到[row, column].因此,如果我们输入data.combined[1,2],它将为您提供第2列第1行中的值.

现在,如果您知道第2列的名称name可以data.combined[1,"name"]用来获得相同的输出data.combined$name[1].回头看看那段代码:

dup.names <- as.character(data.combined[which(duplicated(as.character(data.combined$name))), "name"])

好的,现在我们看到我们的眼睛应该被锁定data.combined[SOMETHING IS IN HERE?!])并慢慢地挑选出来data.combined[ ?ROW? , Oh the "name" column].凉.

找到那些ROW值!

which(duplicated(as.character(data.combined$name)))

只要您看到该which功能,它就会为您提供位置.一个例子:对于逻辑向量a = c(1,2,2,1),which(a == 1)会给你1和s 4的位置.1a

现在duplicated也很简单.duplicated(a)(这只是duplicated(c(1,2,2,1)))会回馈你FALSE FALSE TRUE TRUE.如果我们跑了which(duplicated(a))它会返回34.现在这是一个你将要学习的秘密.如果你有TRUES和FALSES,你不需要使用这个which功能!所以也许which在这里是无知的.而且as.character...因为duplicated数字和字符串的工作.

你应该写什么

我是谁告诉你如何编写代码?但这是我的看法.不要混淆子集的方式:使用EITHER data.frame [,column]或data.frame $ column ...代码可以更清晰地写成:

dupes <- duplicated(data.combined$name)
dupe.names <- data.combines$name[dupes]
Run Code Online (Sandbox Code Playgroud)

或同等地:

dupes <- duplicated(data.combined[,"name"]
dupe.names <- data.combined[dupes,"name"]
Run Code Online (Sandbox Code Playgroud)

我知道这很冗长,但我希望它有所帮助.