小编Wil*_*son的帖子

查找当前.R文件的位置

我已经查看了许多与此相似的问题(见帖子末尾),但我没有找到任何实际完成我需要的解决方案.我根据项目在Windows或Fedora上编码,我为使用Windows和几个Linux发行版的人编写代码.

我的部分工作是为自动分析数据和创建图形的人制作R脚本.最常见的是,我只是向他们发送脚本,它将生成图表.这样,如果数据发生变化或扩展,我不需要为它们重新运行脚本(也可以根据需要进行更改).

问题是我不知道如何获得一个R脚本来找出它自己的位置.能够创建如下工作的代码将非常方便:

  1. 用户将脚本保存到包含数据的文件夹,然后运行脚本.
    • 我通常只是将脚本通过电子邮件发送给我正在使用的人.
    • 他们将脚本保存到包含他们想要分析/绘制的数据的文件夹中.
    • 理想情况下,他们只需启动R,加载脚本,然后运行脚本.
  2. 脚本确定自己的位置,然后将其设置为工作目录.
  3. 脚本分析其自己目录中的数据.
  4. 脚本生成图形并将其保存到自己的目录中.

这个问题只涉及第2步.只要我能做到这一点,其他所有事情都会顺利进行.有这样的东西会很高兴:

setwd(FindThisScriptsLocation())
Run Code Online (Sandbox Code Playgroud)

该行:源(...,CHDIR = T)已建议在这里,但它不能被用于一个脚本来引用自身,除非它知道自己的路.

以下是一些相关问题:

r

19
推荐指数
2
解决办法
2万
查看次数

有人可以解释一下为什么awk的sub()/ gsub()会像这样工作吗?

我知道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)

linux shell awk

15
推荐指数
1
解决办法
2万
查看次数

如何在Iterable.forEach中处理IOException?

我正在玩弄将一组对象写入文件的方法.为什么使用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)

我已经检查了ConsumerIterable文档,他们似乎都没有建议如何解决这个问题.

java foreach lambda checked-exceptions java-8

10
推荐指数
2
解决办法
3343
查看次数

如何在R中填充多个相同类型的对象?

假设我要定义两个类类,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)

r class object slot

6
推荐指数
1
解决办法
810
查看次数

如何从R工作区中删除所有自定义方法和类?

我最近一直在尝试使用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()仍然存在.我想知道如何一举删除所有类和所有自定义方法.

r class s4

6
推荐指数
1
解决办法
1785
查看次数

如何强制删除Kubernetes命名空间?

如何强制删除停留在终止中的命名空间?

重建步骤:

  1. 应用此YAML
apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:
  finalizers:
    - foregroundDeletion
Run Code Online (Sandbox Code Playgroud)
  1. kubectl delete ns delete-me

  2. 无法删除delete-me

我发现的唯一解决方法是销毁并重新创建整个集群。

我尝试过的事情:

这些都不起作用或修改命名空间。在所有这些之后,有问题的终结器仍然存在。

编辑YAML并 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 edit

kubectl 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 …

kubernetes kubernetes-namespace

6
推荐指数
4
解决办法
3172
查看次数

为什么将数据帧中的转换逻辑应用于5个字符的字符串?

假设我有一个数据框:

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不具有上述行为的类似函数?

r apply dataframe

5
推荐指数
1
解决办法
625
查看次数

为什么不对具有as.list.default方法的S4对象进行lapply工作?

假设我有一个类似矢量的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.listas.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)

r class lapply s4

5
推荐指数
1
解决办法
3256
查看次数

如何在S4类中为强大的线性模型创建一个插槽?

我想创建一个具有插槽的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)

r class s4

5
推荐指数
1
解决办法
165
查看次数

部分模板类型推导

我正在编写一个模板,用于在编译时指定的索引中按元素对元组进行排序。我有有效的代码,但使用起来很痛苦,因为我必须指定用于对元组元素进行排序的二元函数的类型。

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?

c++ templates c++11

5
推荐指数
1
解决办法
2998
查看次数

如何在不遇到SecurityException的情况下从Scala脚本引用java.sql?

从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 …

java scala jdbc sbt java-9

5
推荐指数
1
解决办法
196
查看次数

当满足条件时,如何将矢量分割为矢量列表?

我想将一个向量分成一个向量列表.生成的向量将具有可变长度,并且我需要仅在满足某些条件时才进行拆分.

样本数据:

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)

split r

2
推荐指数
1
解决办法
1021
查看次数

R语言,非线性模型公式预测

我用一组数据 (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)

r nls predict

2
推荐指数
1
解决办法
864
查看次数