这可能是一个小点,但我想知道为什么Perl的逻辑运算符(&&,||,和!)优先于易于理解的"英语"逻辑运算符(and,or和not).使用前一组是否有任何优势,以及在脚本中使用后一组的任何缺点?
做了一些搜索但找不到任何有用的东西.我想知道是否有一个摘要表,供初学者了解使用parens/bracket的"规则",特别是(),[],{}之间的差异.不幸的是,根据我的经验,use strict并use warnings没有告诉我,如果我使用错误的parens.
例如,下面是合法代码(b/c来自ikegami).
@{"genotype".($i)}
@{$genotype[$i]}
$genotype[$i] = [ split (/:/, $original_line[$i])]
my @genotype = map {[split /:/]} @original_line[6..14]
Run Code Online (Sandbox Code Playgroud)
但这些下面也是合法的吗?通常情况下(对我来说)知道代码的其他部分(逻辑)是否导致问题是很困难的.通过parens对我(初学者)进行排序对于良好的编码似乎微不足道.任何关于如何正确使用parens的指南都会很棒.
@{"genotype".[$i]}
@["genotype".($i)]
@("genotype".($i))
@{$genotype($i)}
@[$genotype($i)]
$genotypes[$i] = ( split (/:/, $original_line[$i]))
my @genotype = map ([split /:/]) @original_line[6..14]
Run Code Online (Sandbox Code Playgroud) 这可能是一个新手的问题,但我认为我做了我的作业,但还没有找到答案(我希望找到),所以我在这里张贴它寻求一些帮助.
之前提出过类似的问题,但是从我发现的问题来看,除了"昂贵的"解决方案之外,没有任何答案可以帮助我解决当前问题,这需要R的编辑.
我了解到ls并objects允许我们查看包中的对象.但即便如此ls(all.names=TRUE),我仍然看不到所有的内容.有人建议,ls(getNAMEspace)但这对我来说还不够"好".
例如
>search()
[1]".GlobalEvn" "package:TCGAGBM"
>ls("package:TCGAGBM")
character(0)
>ls(getNamespace("TCGAGBM"),all.names=TRUE)
[1]"._NAMESPACE_." "._S3MethodsTable_." ".packageName"
Run Code Online (Sandbox Code Playgroud)
但是,在C(cmd)下,我看到以下内容
C:\ Users\XYZ\Documents\R\R-2.15.1\library\TCGAGBM... data extdata ......(共3个文件,7个Dir(s))
当我看到下面的脚本行时,我遇到了这种"差异" -
>clinical=read.delim(system.file(
+"extdata/Clinical/clinical_patient_public_GBM.txt.gz",
+package="TCGAGBM"), header=TRUE)
Run Code Online (Sandbox Code Playgroud)
因此,我想知道在R下是否有办法查看包中的所有内容,以便我们"知道"如何更好地利用包.Vignette可能会有所帮助,但是由于我迄今为止对R的经验有限,我发现有些软件包没有附带Vignette.
任何评论将不胜感激,以帮助我了解更多关于R.
试着写我的第二个Latex文件
\documentclass{article}
\title{simple Sweave script}
\usepackage{/Users/Brenden/Documents/R/R-2.15.1/share/texmf/tex/latex/Sweave}
\begin{document}
\maketitle
This is a simple script to demonstrate Sweave. Let's
begin by generating some results
<<>>=
x=rnorm(30)
y=rnorm(30)
mean(x)
cor(x,y)
@
and follow that up with some random text
\end{document}
Run Code Online (Sandbox Code Playgroud)
文件以.Rnw作为扩展名保存.然后我可以在R下使用Sweave将文件转换为tex.然后我在cmd下运行pdflatex来获取我的.pdf文件.R存储在/ Users/Brenden/Documents下.MiKTex存储在/ Users/Brenden/Desktop下.
据说通常不需要使用"usepackage"行,因为当我在R下运行Sweave时,一行"usepackage {Sweave}"将被添加到tex文件中,该文件存储在/ Users/Brenden/Documents下.但是,如果我没有输入userpackage行,当我在cmd下运行pdflatex时(在/ Documents或/ Desktop下),我得到了一个"Sweave.sty not found"的消息.所以我总是通过添加一行usepackage以及详细的路径帮助规避问题来解决这个问题.虽然"Sweave.sty not found"问题被规避了,但我注意到当我在cmd下运行pdflatex时,我得到了回复
LaTeX Warning: You have requested package '/Users/Brenden/Documents/R/R-
2.15.1/share/texmf/tex/latex/Sweave', but the package provides "Sweave'.
Run Code Online (Sandbox Code Playgroud)
然后它在MiKTex下使用.sty运行几个文件
(C:\Users\Brenden\Desktop\MiKTex\tex\latex\base\ifthen.sty)
(C:\Users\Brenden\Desktop\MiKTex\tex\latex\graphics\graphicx.sty)
(C:\Users\Brenden\Desktop\MiKTex\tex\latex\graphics\keyval.sty)
(C:\Users\Brenden\Desktop\MiKTex\tex\latex\graphics\graphics.sty)
(C:\Users\Brenden\Desktop\MiKTex\tex\latex\graphics\trig.sty)
...
Run Code Online (Sandbox Code Playgroud)
最终创建一个.pdf
从Stackoverflow上的另一篇文章中可以看出,"当您安装LaTeX时,该路径会自动设置;它是您的个人texmf树,您可以将任何想要LaTeX的样式或类文件放在那里.目录名称无关紧要,它以递归方式搜索Sweave.sty".然而,对我而言,除非我指定路径,否则我的MiKTex显然无法找到Sweave.sty.即使有了路径规范,LaTex仍然会给我一个警告.有人可以向我解释一下我搞砸了吗(在安装MiKTex期间,也许?)这样我就可以帮助MiKtex在没有指定路径的情况下找到Sweave的方式?
谢谢.
我试图基于现有阵列构建一个新阵列.
#!/usr/bin/perl
#join
use warnings;
use strict;
my @names = ('jacob', 'michael', 'joshua', 'mathew');
my @t_names = join ("\t" , @names);
my @t_names2 = join ("\t", $names[0],$names[2]);
print @t_names, "\n";
print @t_names2, "\n";
Run Code Online (Sandbox Code Playgroud)
测试脚本允许我连接旧数组中的2个元素以形成新数组.但是如果我的数组有1000个元素并且我想形成一个只包含1000个元素的选择部分的新数组(例如,元素3和3的倍数).我试过join ("\t", $names[0,2])但是perl无法识别$names[0,2](输出表明它$names[0,2]被"识别"为$names[2].并且不确定这个错误意味着什么" multidimensional syntax not supported at join.pl"
如果join不是正确的函数,我可以用其他方式从现有数组构建一个部分数组?谢谢.
可能重复:
R:显示包中S4函数的源代码
我下载了一个包(GEOquery)并正在玩一些函数.其中一个被调用Table,根据我的理解,它能够制表S4数据集.
例如
> summary(GDS2853) # GDS2853 is a dataset I downloaded from NCBI
Length Class Mode
1 GDS S4
Run Code Online (Sandbox Code Playgroud)
getAnywhere(Table) 节目
> getAnywhere(Table)
A single object matching ‘Table’ was found
It was found in the following places
package:GEOquery
namespace:GEOquery
with value
function (object)
standardGeneric("Table")
<environment: 0x06ad5268>
attr(,"generic")
[1] "Table"
attr(,"generic")attr(,"package")
[1] "GEOquery"
attr(,"package")
[1] "GEOquery"
attr(,"group")
list()
attr(,"valueClass")
character(0)
attr(,"signature")
[1] "object"
attr(,"default")
`\001NULL\001`
attr(,"skeleton")
function (object)
stop("invalid call in method dispatch …Run Code Online (Sandbox Code Playgroud) SCRIPT1:
#!usr/bin/perl
#concatenation2.pl
use warnings;
use strict;
print"Four sevens are",4*7 ,"\n";
print"Four sevens are".4*7 ."\n";
Run Code Online (Sandbox Code Playgroud)
SCRIPT2:
#!usr/bin/perl
#concatenation2.pl
use warnings;
use strict;
print"Four sevens are",4*7,"\n";
print"Four sevens are".4*7."\n";
Run Code Online (Sandbox Code Playgroud)
script1的输出是:
Four sevens are28
Four sevens are28
Run Code Online (Sandbox Code Playgroud)
好的,所以我(了解到)在关闭双引号之前需要一个空格.但是,script2的输出最终出现错误消息:
string found where operator expected at concatenate2.pl line 6, near "7."\n""
(Missing operator before "\n"?)
syntax error at concatenate2.pl line 6, near "7."\n""
Run Code Online (Sandbox Code Playgroud)
我无处可寻找解释为什么数字和数字之间需要有空格的原因.在script2中,虽然数字之间不需要空间,但我目前依靠谷歌和免费的perl书来帮助我学习语言.任何帮助(这种细微差别的一般准则)将不胜感激.谢谢.
关于使用的类似问题
#! /usr/bin/perl
Run Code Online (Sandbox Code Playgroud)
已经回答了.但我认为我有一个稍微不同的问题,尽管可能仍然与知情人士相似,因为我对计算缺乏了解.
我的Windows上没有UNIX,所以无法直接测试以下内容,但是虽然在Windows下运行Perl确实不需要shebang行,而hello.pl中的shebang行,我仍然无法运行文件,如果我从
c:\Users\XYZ\Desktop\BegPerl
Run Code Online (Sandbox Code Playgroud)
至
c:\Users\XYZ\Desktop
Run Code Online (Sandbox Code Playgroud)
我的脚本存储在
c:\Users\XYZ\Desktop\BegPerl
Run Code Online (Sandbox Code Playgroud)
我的perl文件夹存储在
c:\Strawberry\perl\bin\perl.exe
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
perl hello.pl下找到hello.pl ,c:\Users\XYZ\Desktop\BegPerl但c:\Users\XYZ\Desktop即使包含了shebang行,也不能找到它?我得到的关于shebang线的"目的"的答案是
对于类UNIX系统来定位脚本的可执行文件
所以,我想我的两个问题的答案可能与类UNIX系统和Windows之间的区别有关.
我在理解基本规则方面遇到了很多麻烦,regex并希望有人能用"简单的英语"帮助解释它们.
$_ = '1: A silly sentence (495,a) *BUT* one which will be useful. (3)';
print "Enter a regular expression: ";
my $pattern = <STDIN>;
chomp($pattern);
if (/$pattern/) {
print "The text matches the pattern '$pattern'.\n";
print "\$1 is '$1'\n" if defined $1;
print "\$2 is '$2'\n" if defined $2;
print "\$3 is '$3'\n" if defined $3;
print "\$4 is '$4'\n" if defined $4;
print "\$5 is '$5'\n" if defined $5;
}
Run Code Online (Sandbox Code Playgroud)
三个测试输出
Enter a regular expression: ([a-z]+) …Run Code Online (Sandbox Code Playgroud) 编程的新手.任务是从字符串中提取特定数据,我选择编写如下代码 -
while ($line =<IN>) {
chomp $line;
@tmp=(split /\t/, $line);
next if ($tmp[0] !~ /ch/);
@tgt1=@tmp[8..11];
@tgt2=@tmp[12..14];
@tgt3=@tmp[15..17];
@tgt4=@tmp[18..21];
foreach (1..4) {
print @tgt($_), "\n";
}
Run Code Online (Sandbox Code Playgroud)
我认为@tgt($_)会被解释为@tgt1, @tgt2, @tgt3, @tgt4但我仍然得到@tgt一个全局符号的错误消息(@ tgt1,@ tgt2,@ tgt3,@ tgt4`已被声明).
Q1.我是否误解了foreach循环?
Q2.为什么perl看不到@tgt($_)@ tgt1,@ tgt2 ..etc?
Q2.根据经验,这可能是命名变量的一种不好的方法.命名具有相似特征的变量的首选方法是什么?
和哈希一起玩我遇到了以下输出,不知道为什么会这样.默认情况下哈希中是否有嵌入的空格?
#! /usr/bin/perl
# playwhash
use warnings;
use strict;
my %normal = ("Tom ","5'3","Peter ","5'11","John " ,"5'7",);
foreach (1..6) {
print each %normal, "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出看起来像
Peter 5'11
Tom 5'3
John 5'7
Peter 5'11
Tom 5'3
Run Code Online (Sandbox Code Playgroud) 通过提问来获得减分的风险,我正在为Perl解释器提取的错误寻求帮助.这是Beginning Perl的作业问题.
问:修改货币计划以继续询问货币名称,直到输入有效的货币名称.
#! /usr/bin/perl
#convert.pl
use warnings;
use strict;
my ($value, $from, $to, $rate, %rates);
%rates = (
pounds => 1,
dollars => 1.6,
marks => 3,
"french frances" => 10,
yen => 174.8,
"swiss frances" => 2.43,
drachma => 492.3,
euro => 1.5
);
print "currency exchange formula -
pounds, dollars, marks, french frances,
yen, swiss frances, drachma, euro\n";
print "Enter your starting currency: ";
$from = <>;
chomp($from);
While ($from ne $rates{$from}) {
print "I don't know …Run Code Online (Sandbox Code Playgroud) 看到了脚本(见下文),但找不到更多关于"-n"的信息.
my $numeric =0;
my $input = shift;
if ($input eq "-n") {
$numeric =1;
$input = shift;
}
my $output = shift;
open INPUT, $input or die $!;
open OUTPUT, ">$output" or die $!;
my @file = <INPUT>;
if ($numeric) {
@file = sort { $a <=> $b } @file;
} else {
@file = sort @file;
}
print OUTPUT @file;
Run Code Online (Sandbox Code Playgroud)
解释脚本的文本说明如下"如果我们在程序名称之后在命令行上看到的第一件事是字符串-n,那么我们正在进行数字排序." Google搜索似乎无法识别大多数"非字母数字"符号,因此"-n"搜索不会产生任何效果.我看到的唯一另一个地方"-n"是学习perl,它说下面的"转换后的sed脚本可以使用或不使用-n选项".甚至不确定这是否与"-n"脚本中的相同.任何想法,我可以找到更多关于-n它的信息(虽然它可能只是一个数字字符串??没有别的更多)