Ну, во-первых, лично я не имел бы идентичных элементов (с точки зрения HTML) на одной странице, если бы мог контролировать это. Но чтобы ваш элемент отображался в HTML, должно работать следующее: (Я пишу Javascript из-за вашего тега транспортира, я предполагаю, что так написаны ваши тесты)
buttons = driver.findElements(By.xpath("//button"))
buttons[1].click();
Однако, если вы хотите найти его по имени (для любого случая использования), который вы могли бы сделать
buttonWithText1 = driver.findElement(By.xpath("//td[text()[contains(., 'test1')]]/following-sibling::td/button");
buttonWithText1.click();
Поскольку @Sers указывает ниже, xpath //td[.='test1']/following-sibling::td/button
также работает и является самым чистым. Или самое короткое, по крайней мере.
Если вы хотите динамически использовать этот xpath для поиска кнопок по этому тексту, вы можете использовать:
var myText = "test1"
driver.findElement(By.xpath("//td[.='" + myText + "']/following-sibling::td/button).click()
пользователь сказал, что он не хочет использовать xpath. Основываясь на HTML, вы можете использовать селектор CSS, как этот, чтобы выбрать кнопку рядом с какой-нибудь строкой myText.
var buttons = browser.findElements(By.css(‘button.ng-binding’))
var tds = browser.findElements(By.css(‘td.ng-binding’))
for (i = 0; i < tds.length; i++) {
if (tds[i].getText()==myText) {
buttons[i].click()
break;
}
}
Просто слежу за Мэттом и Дирком. Если вы хотите воссоздать существующий фрейм данных без изменения глобального параметра, вы можете воссоздать его с помощью оператора apply:
bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)
Это преобразует все переменные в класс "character", если вы хотите преобразовать только коэффициенты, см. Решение Марека ниже .
Как отмечает @hadley, следующее более лаконично.
bob[] <- lapply(bob, as.character)
В обоих случаях lapply
выводит список; однако из-за магических свойств R использование []
во втором случае сохраняет класс data.frame объекта bob
, тем самым устраняя необходимость преобразования обратно в data.frame с использованием as.data.frame
с аргументом stringsAsFactors = FALSE
.
Это работает, преобразовывая все к символу и затем числовому к числовому:
makenumcols<-function(df){
df<-as.data.frame(df)
df[] <- lapply(df, as.character)
cond <- apply(df, 2, function(x) {
x <- x[!is.na(x)]
all(suppressWarnings(!is.na(as.numeric(x))))
})
numeric_cols <- names(df)[cond]
df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
return(df)
}
Адаптированный от: Добираются, типы столбца Excel покрывают автоматически
Возможно, более новая опция?
library("tidyverse")
bob <- bob %>% group_by_if(is.factor, as.character)
Или вы можете попробовать преобразовать
:
newbob <- transform(bob, phenotype = as.character(phenotype))
Просто не забудьте указать каждый коэффициент, который вы хотите преобразовать в символ.
Или вы можете сделать что-то вроде этого и убить всех вредителей одним ударом:
newbob_char <- as.data.frame(lapply(bob[sapply(bob, is.factor)], as.character), stringsAsFactors = FALSE)
newbob_rest <- bob[!(sapply(bob, is.factor))]
newbob <- cbind(newbob_char, newbob_rest)
Пихать данные в такой код не хорошая идея, я мог бы сделать sapply
отдельно (на самом деле, это намного проще сделать так), но вы поняли ... Я не проверял код, потому что меня нет дома, поэтому я надеюсь, что это сработает! =)
У этого подхода, однако, есть обратная сторона ... вы должны впоследствии реорганизовать столбцы, а с преобразованием
вы можете делать все, что захотите, но за "пешеходный стиль- написание кода " ...
Так вот ... =)
Обновление: вот пример того, что не работает. Я думал, что будет, но я думаю, что опция stringsAsFactors работает только с символьными строками - она оставляет факторы в покое.
Попробуйте следующее:
bob2 <- data.frame(bob, stringsAsFactors = FALSE)
Вообще говоря, всякий раз, когда у вас возникают проблемы с факторами, которые должны быть символами, существует параметр stringsAsFactors
, который может вам помочь (включая глобальный параметр).
Другой способ - преобразовать его с помощью apply
bob2 <- apply(bob,2,as.character)
И лучший (предыдущий относится к классу 'matrix')
bob2 <- as.data.frame(as.matrix(bob),stringsAsFactors=F)
Глобальный параметр
stringsAsFactors: Настройка по умолчанию для аргументов data.frame и read.table.
может быть чем-то, что вы хотите установить на FALSE
в ваших файлах запуска (например, ~ / .Rprofile). См. справку (параметры)
.
Для замены только факторов:
i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)
В пакете dplyr в версии 0.5.0 была введена новая функция mutate_if
:
library(dplyr)
bob %>% mutate_if(is.factor, as.character) -> bob
Пакет purrr из RStudio дает другую альтернативу :
library(purrr)
library(dplyr)
bob %>% map_if(is.factor, as.character) %>% as_tibble -> bob