使用class DefaultArray implements arrayaccess {
private $default='Default Value';
private $properties=[];
function __construct($default_value) {
$this->default=$default_value;
}
function offsetSet($property, $value) {
$this->properties[$property]=$value;
return $this;
}
function offsetGet($property) {
return isset($this->properties[$property])? $this->properties[$property]:$this->default;
}
function offsetExists($property) {
return isset($this->properties[$property]);
}
function offsetUnset($property) {
unset($this->properties[$offset]);
}
}
$myArray=new DefaultArray('my default value');
$myArray['bye'] = 'goodbye';
var_dump($myArray['bye']); // <-- would print 'goodbye'
var_dump($myArray['hello']); // <-- would print 'my default value'
,我有这个数据集:
txt.file
使用此功能,
Xenopsylla cheopis Echinolaelaps sp.
Maxomys rajah 1 3
Callosciurus prevostii borneensis 4 2
R似乎将我的数据识别为不同的列/行并产生此错误:
test<-read.table("data.txt",header=T)
Xenopsylla cheopis Echinolaelaps sp.
Maxomys rajah 1 3
Callosciurus prevostii borneensis 4 2
我试图使用Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
line 2 did not have 4 elements
,但似乎它没有产生我想要的东西
答案 0 :(得分:1)
首先,我将数据存储在角色向量中,就像我在这里所做的那样:
test<-readChar("C:/Users/Julian/Downloads/file.txt", file.info("C:/Users/Julian/Downloads/file.txt")$size)
显然,你需要用你的文件替换我文件的路径。
然后使用gsub()
test<-gsub("([[:lower:]])([[:space:]])([[:lower:]])", "\\1\\3",test)
最后,您可以使用带有read.table()
参数的text
来阅读您的数据:
a<-read.table(text=test,sep="\t",header=TRUE,row.names = 1)
a
Xenopsyllacheopis Echinolaelapssp. Ixodessp.
Maxomysrajah 3 8 9
Callosciurusprevostiiborneensis 5 7 1
Sundamysmuelleri 3 5 7
Niviventercremoriventer 6 8 9
修改强> 在评论中回答OP的新问题:
"([[:lower:]])([[:space:]])([[:lower:]])"
使我们能够找到我们使用readChar()
创建的与此模式匹配的字符串的所有部分。此模式为:小写字母后跟空格,后跟小写字母。
您可以理解这个属与种的名称匹配,但不能理解物种名称和以下属,因为属以大写字母开头。
现在"\\1\\3"
部分意味着我们保留了我们的第一部分和第三部分
"([[:lower:]])([[:space:]])([[:lower:]])"
模式。那是([[:lower:]])
和([[:lower:]])
。由于"\\1
中的\\3
和"\\1\\3"
之间没有空格,我们将在没有空格的情况下加入它们。因此,我们将有Genusspecies而不是Genus物种。