我已经查看了许多与此相似的问题(见帖子末尾),但我没有找到任何实际完成我需要的解决方案.我根据项目在Windows或Fedora上编码,我为使用Windows和几个Linux发行版的人编写代码.
我的部分工作是为自动分析数据和创建图形的人制作R脚本.最常见的是,我只是向他们发送脚本,它将生成图表.这样,如果数据发生变化或扩展,我不需要为它们重新运行脚本(也可以根据需要进行更改).
问题是我不知道如何获得一个R脚本来找出它自己的位置.能够创建如下工作的代码将非常方便:
这个问题只涉及第2步.只要我能做到这一点,其他所有事情都会顺利进行.有这样的东西会很高兴:
setwd(FindThisScriptsLocation())
Run Code Online (Sandbox Code Playgroud)
该行:源(...,CHDIR = T)已建议在这里,但它不能被用于一个脚本来引用自身,除非它知道自己的路.
以下是一些相关问题:
.R脚本文件在哪里...(处理包)
如何让R识别您的工作目录...(设置默认工作目录)
Rscript:确定执行脚本的路径(一个脚本调用其他脚本;没有找到答案)
我知道awk可以做文本/字符串替换与sub()和gsub()这样的:
kent$ echo "fffff"|awk '{gsub("f", "b")}1'
bbbbb
Run Code Online (Sandbox Code Playgroud)
要么
kent$ echo "fffff"|awk '{gsub(/f/, "b")}1'
bbbbb
Run Code Online (Sandbox Code Playgroud)
然而今天我犯了一个拼写错误,我写道:
kent$ echo "fffff"|awk '{gsub('f', "b")}1'
Run Code Online (Sandbox Code Playgroud)
但是awk并没有抱怨那个但是像往常一样产生输出,当然是意外的输出,我花了一些时间来找出错误.输出awk给了我:
bfbfbfbfbfb
Run Code Online (Sandbox Code Playgroud)
另一个例子:
kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1'
BfBaBfBaBfBaBfBaBfBXBXB
Run Code Online (Sandbox Code Playgroud)
例子sub()也很奇怪:
kent$ echo "thanks in advance"|awk '{sub('a', "B")}1'
Bthanks in advance
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下奇怪的替换怎么办?
kent$ awk --version
GNU Awk 4.0.2
Run Code Online (Sandbox Code Playgroud)
编辑
感谢Joni的回答.也许这个例子更好地解释了,我只是在这里添加它:
kent$ echo "thanks in advance"|awk '{f="k";sub('f', "B")}1'
thanBs in advance
kent$ echo "thanks in advance"|awk '{sub('th ank', "B")}1'
awk: …Run Code Online (Sandbox Code Playgroud) 我正在玩弄将一组对象写入文件的方法.为什么使用Iterable.forEach()的下面的实现不能编译?在Eclipse中,我收到的消息是没有处理IOException.这特别令人困惑,因为我似乎正在处理IOExceptions.
public void write(Iterable<?> objects) {
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("out.txt"), "UTF-8"));) {
objects.forEach((o) -> bw.write(o.toString())); //Unhandled exception type IOException
} catch (IOException e) {
//handle exception
}
}
Run Code Online (Sandbox Code Playgroud)
显然,下面的工作.我很感兴趣为什么以上不起作用以及如何解决它.
for (Object o : objects) { bw.write(o.toString()); }
Run Code Online (Sandbox Code Playgroud)
假设我要定义两个类类,Sentence并且Word.每个单词对象都有一个字符串和一个词性(pos).每个句子包含一些单词,并有一个额外的数据槽.
该Word班是简单的定义.
wordSlots <- list(word = "character", pos = "character")
wordProto <- list(word = "", pos = "")
setClass("Word", slots = wordSlots, prototype = wordProto)
Word <- function(word, pos) new("Word", word=word, pos=pos)
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个Sentence可以包含一些Words和一些数值数据的类.
如果我将Sentence类定义为:
sentenceSlots <- list(words = "Word", stats = "numeric")
sentenceProto <- list(words = Word(), stats = 0)
setClass("Sentence", slots = sentenceSlots, prototype = sentenceProto)
Run Code Online (Sandbox Code Playgroud)
那句话只能包含一个单词.我显然可以用许多插槽来定义它,每个字一个,但是它的长度会受到限制.
但是,如果我Sentence像这样定义类:
sentenceSlots <- list(words = "list", stats = …Run Code Online (Sandbox Code Playgroud) 我最近一直在尝试使用S4类,并且重新启动R以清除工作区中的所有类定义和自定义方法是一件痛苦的事.显然rm(list=ls(all.names=TRUE))是没用的.我可以通过逐行编写行来单独手动删除所有类和方法,但我确信必须有一个更简单的方法.
一个展示我的问题的例子:
.myClass <- setClass("myClass", representation=representation(mySlot="numeric"))
mySlot <- function(x) x@mySlot
setMethod("[", signature=c("myClass", "numeric", "missing"), function(x, i, j, ...) {
initialize(x, mySlot=mySlot(x)[i])
})
Run Code Online (Sandbox Code Playgroud)
尝试删除所有内容rm():
rm(list=ls(all.names=TRUE))
Run Code Online (Sandbox Code Playgroud)
但是,类定义和自定义方法仍然存在:
> x <- new("myClass", mySlot=1:4)
> x[1]
Error in x[1] : could not find function "mySlot"
Run Code Online (Sandbox Code Playgroud)
因为mySlot()它是一个被删除的对象rm,但方法引用mySlot()仍然存在.我想知道如何一举删除所有类和所有自定义方法.
如何强制删除停留在终止中的命名空间?
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
- foregroundDeletion
Run Code Online (Sandbox Code Playgroud)
kubectl delete ns delete-me
无法删除delete-me。
我发现的唯一解决方法是销毁并重新创建整个集群。
这些都不起作用或修改命名空间。在所有这些之后,有问题的终结器仍然存在。
kubectl apply应用:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
Run Code Online (Sandbox Code Playgroud)
$ kubectl apply -f tmp.yaml
namespace/delete-me configured
Run Code Online (Sandbox Code Playgroud)
该命令无错误地结束,但是名称空间未删除。
下面的YAML具有相同的结果:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
Run Code Online (Sandbox Code Playgroud)
kubectl editkubectl edit ns delete-me,然后删除终结器。同上完全删除列表。同上删除spec。同上替换finalizers为空列表。
$ kubectl edit ns delete-me
namespace/delete-me edited
Run Code Online (Sandbox Code Playgroud)
这不会显示任何错误信息,但不会更新命名空间。kubectl edit再次查看该对象将显示终结器仍然存在。
kubectl proxy &kubectl …假设我有一个数据框:
mydf <- data.frame(colA = c(1,20), colB = c("a", "ab"), colC = c(T, F))
Run Code Online (Sandbox Code Playgroud)
现在假设我想对数据框中的每一行应用一个函数。此函数使用列C的布尔值。使用时apply,每个非字符串都将转换为该列中存在的最大长度的字符串:
> apply(mydf, 1, '[', 3)
[1] " TRUE" "FALSE"
Run Code Online (Sandbox Code Playgroud)
该字符串" TRUE"不再可解释为逻辑。
> ifelse(apply(mydf, 1, '[', 3), 1, 2)
[1] NA 2
Run Code Online (Sandbox Code Playgroud)
我可以用来解决此问题gsub(" ", "", x),但我敢肯定有更好的方法。为什么apply仅将逻辑直接转换为字符串时会有这种行为?是否存在apply不具有上述行为的类似函数?
假设我有一个类似矢量的S4类:
.MyClass <- setClass("MyClass", representation(a="numeric", b="character"))
setMethod("[", c("MyClass", "numeric", "missing"), function(x, i, j, ...) {
do.call(initialize, c(x, sapply(slotNames(x), function(y) slot(x, y)[i],
simplify=FALSE)))
})
setMethod("length", "MyClass", function(x) length(x@a))
Run Code Online (Sandbox Code Playgroud)
说我还定义方法as.list和as.list.default:
setGeneric("as.list")
setMethod("as.list", "MyClass",
function(x) lapply(seq_along(x), function(i) x[i]))
setGeneric("as.list.default")
setMethod("as.list.default", "MyClass",
function(x) lapply(seq_along(x), function(i) x[i]))
Run Code Online (Sandbox Code Playgroud)
现在给出这个类的对象,myobj:
myobj <- .MyClass(a=1:4, b=letters[1:4])
Run Code Online (Sandbox Code Playgroud)
当我使用时lapply,它会抱怨:
> lapply(myobj, function(i) rep(i@b, i@a))
Error in as.list.default(X) :
no method for coercing this S4 class to a vector
Run Code Online (Sandbox Code Playgroud)
但是如果我使用as.list.default,该函数会提供所需的输出:
> lapply(as.list.default(myobj), …Run Code Online (Sandbox Code Playgroud) 我想创建一个具有插槽的S4类,它可以保存强大的线性模型.
稳健的线性模型是MASS包装中的一种线性模型.它们包含线性模型所具有的所有信息以及更多信息.
library(MASS)
x <- 1:5
y <- 1:5
mylm <- lm(x~y)
myrlm <- rlm(x~y)
Run Code Online (Sandbox Code Playgroud)
这是我的班级:
.MyClass <- setClass("MyClass", list(a="lm", id="numeric"))
Run Code Online (Sandbox Code Playgroud)
即使.MyClass(a=mylm, id=1)生成了预期的对象,也要初始化rlm失败的对象:
> .MyClass(a=myrlm, id=1)
Error in validObject(.Object) :
invalid class “MyClass” object: 1: invalid object for slot "a" in class "MyClass": got class "rlm", should be or extend class "lm"
invalid class “MyClass” object: 2: invalid object for slot "a" in class "MyClass": got class "lm", should be or extend class "lm" …Run Code Online (Sandbox Code Playgroud) 我正在编写一个模板,用于在编译时指定的索引中按元素对元组进行排序。我有有效的代码,但使用起来很痛苦,因为我必须指定用于对元组元素进行排序的二元函数的类型。
template <typename BinaryFunction, int Index>
struct sort_by_index_t {
explicit sort_by_index_t(const BinaryFunction& binary_function)
: binary_function(binary_function) {}
template <typename Tuple>
bool operator()(const Tuple& left, const Tuple& right) const {
return binary_function(std::get<Index>(left),
std::get<Index>(right));
}
private:
const BinaryFunction binary_function;
};
template <typename BinaryFunction, int Index>
sort_by_index_t<BinaryFunction, Index>
sort_by_index(const BinaryFunction& binary_function) {
return sort_by_index_t<BinaryFunction, Index>(binary_function);
}
Run Code Online (Sandbox Code Playgroud)
所以如果我想按元组中的第一个元素排序,我必须输入:
sort_by_index<std::less<char>, 0>(std::less<char>());
Run Code Online (Sandbox Code Playgroud)
相反,我宁愿有一个如下所示的界面以避免重复,但它目前无法编译。
sort_by_index<0>(std::less<char>());
Run Code Online (Sandbox Code Playgroud)
我没有看到自动推断的方法Index(并且没有必要),但sort_by_index应该能够推断BinaryFunction.
如何重写上述内容,以便我不需要指定BinaryFunction?
从Java 9开始,直接从scala脚本使用时,从Scala中调用java.sql中定义的对象会抛出java.lang.SecurityException.
Java Version: 10.0.1
Scala Version: 2.12.4
sbt Version: 1.2.0
Run Code Online (Sandbox Code Playgroud)
下面的屏幕截图是一个完整的最小工作示例,其中包含适用于工作和非工作版本的控制台输出.具体来说:将脚本代码复制到类中,并从该类运行它,可以解决问题.有没有办法编写直接使用对象的Scala脚本java.sql?
build.sbt
name := "mypackage"
version := "0.1"
scalaVersion := "2.12.4"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.4"
Run Code Online (Sandbox Code Playgroud)
broken-script.scala
import java.sql.{Connection, DriverManager}
import java.util.Properties
object Main {
private def url = "jdbc:postgresql://localhost:5432/postgres"
val credentials: Properties ={
val properties = new Properties()
properties.setProperty("user", "integration_test")
properties.setProperty("password", "integration-pass")
properties
}
def connect(): Connection =
DriverManager.getConnection(url, credentials)
def run(): Unit = {
connect()
}
}
Main.run()
Run Code Online (Sandbox Code Playgroud)
如下面的控制台输出所示,broken-script.scala遇到SecurityException.
brokenScript.scala Output …
我想将一个向量分成一个向量列表.生成的向量将具有可变长度,并且我需要仅在满足某些条件时才进行拆分.
样本数据:
set.seed(3)
x <- sample(0:9,100,repl=TRUE)
Run Code Online (Sandbox Code Playgroud)
例如,在这种情况下,我想x在每个0处拆分上面的向量.
目前我用自己的功能做到这一点:
ConditionalSplit <- function(myvec, splitfun) {
newlist <- list()
splits <- which(splitfun(x))
if (splits == integer(0)) return(list(myvec))
if (splits[1] != 1) newlist[[1]] <- myvec[1:(splits[1]-1)]
i <- 1
imax <- length(splits)
while (i < imax) {
curstart <- splits[i]
curend <- splits[i+1]
if (curstart != curend - 1)
newlist <- c(newlist, list(myvec[curstart:(curend-1)]))
i <- i + 1
}
newlist <- c(newlist, list(myvec[splits[i]:length(vector)]))
return(newlist)
}
Run Code Online (Sandbox Code Playgroud)
这个函数给出了我喜欢的输出,但我确信这比我的更好.
> MySplit <- function(x) x == 0 …Run Code Online (Sandbox Code Playgroud) 我用一组数据 (x, y) 拟合指数公式。然后我想根据公式计算 y 值,其中 x 值超出实际数据集。它不起作用,总是打印实际 x 值的 y 值。这是代码。我做错了什么?我的 R 语言任务的解决方案是什么:
data <- data.frame(x=seq(1,69), y=othertable[1:69, 2])
nlsxypw <- nls(data$y ~ a*data$x^b, col2_60, start=list(a=2200000, b=0))
predict(nlsxypw)
#here I want to calculate the y values for x = 70-80
xnew <- seq(70, 80, 1)
predict(nlsxypw, xnew)
#it doesn't print these values, still the actual values for x=1~69.
Run Code Online (Sandbox Code Playgroud)